1. 程式人生 > >R語言-基本數據管理

R語言-基本數據管理

tac math row 日期類 由於 format tile 格式轉換 運算

目的:學會對原始的數據集進行整理(日期,缺失值,變量創建等),然後通過修改後的數據集可以更有針對性的來分析數據

案例:分析男性和女性經理人在領導自己企業的不同

  問題:1.處於管理崗的男性和女性在服從上級的程度上是否有所不同

     2.導致不同的原因是因為性別還是國家,或者是年齡

 1.準備數據集

 1 manager <- c(1,2,3,4,5)
 2 date <- c(10/24/08,10/28/08,10/1/28,10/12/08,5/1/09)
 3 country <- c(US,US,UK,UK,UK)
 4 gender <- c(M
,F,F,M,F) 5 age <- c(32,45,25,39,99) 6 q1 <- c(5,3,3,3,2) 7 q2 <- c(4,5,5,3,2) 8 q3 <- c(5,2,5,4,1) 9 q4 <- c(5,5,5,NA,2) 10 q5 <- c(5,5,2,NA,1) 11 leadship <- data.frame(manager,date,country,gender,age,q1,q2,q3,q4,q5.stringAsFactors=F)

2.修正異常數據

1 leadship <- within(leadship,{
2 agecat <- NA 3 agecat[age>75 & age < 99] <- Elder 4 agecat[age>= 55 & age <= 75] <- Middle Age 5 agecat[age < 55] <- Young})

# 1.創建新的變量
# 2.將該變量綁定到數據集上
# 3.將新變量做條件篩選,如果age大於75歲表示值錯誤,用NA值進行填

3.修改列明

1 # 1.使用代碼修改
2 names(leadship[6:10]) <- c(item1,item2,item3,itgem4,item5)
3 
4 # 2.使用對話框修改
5 fix(leadship)

4.去掉NA值的數據行

1 newdata <- na.omit(leadship)

5.日期格式轉換

1 # 1.設置日期格式
2 # 2.將該字段轉換為日期類型
3 myformat <- %m-%d-%y
4 leadship$date <- as.Date(leadship$date,myformat)

6.排序

1 # 1.使用order(字段名)進行排序,默認是升序,加-就是降序
2 attach(leadship)
3 newdata <- leadship[order(gender,-age)]
4 detach(leadship)

7.剔除變量

1 # 1.進行條件篩選,篩選出需要剔除的字段
2 # 2.將操作後的數據集重新賦值
3 myvars <- names(leadship) %in% c(q3,q4)
4 newdata <- leadship[!myvars]

8.條件篩選

1 # 1.選擇所有age大於等於35或者小於24的行,保留變量q1~q4
2 # 2.選擇所有25歲以上的男性,並保留gender到q4的所有列
3 newdata <- subset(leadship,age>=35 | age < 24,select = c(q1,q2,q3,q4))
4 
5 newdata <- subset(leadship,gender=M & age > 25,select = gender:q4)

9.隨機抽樣

1 # 從數據集中隨機抽取出3行數據
2 mysample <- leadship[sample(1:nrow(leadship),3,replace = F),]

10.使用SQL操作數據集

library(sqldf)
newdf <- sqldf(select * from mtcars where carb=1 order by mpg,row.names = T)
sqldf(select avg(mpg) as avg_mpg,avg(disp) as avg_disp,gear from mtcars where cyl in (4,6) group by gear )

案例2:一組學生參加了科學,數學,英語的考試,為了衡量學生的統一考試水平,前20%的學生為A,接下來20%的學生為B,以此類推,最後按照字母對學生進行排序

1.準備數據

1 options(digits = 2)
2 Student <- c(John Davis,Angela Williams,Bullwinkle Moose,David Jones,
3              Janice Markhammer,Cheryl Cushing,Reuven Ytzrhak,Greg Knox,
4              Joel England,Mary Rayburn)
5 Math <- c(502,600,412,358,495,512,410,625,573,522)
6 Science <- c(95,99,80,82,75,85,80,95,89,86)
7 English <- c(25,22,18,15,20,28,15,30,27,18)
8 roster <- data.frame(Student,Math,Science,English,stringsAsFactors = F)

2.轉換考試成績

# 由於每門課程的得分不一致,所以將所有的成績計算標準差來實現標準化
z <- scale(roster[,2:4])

3.計算成績標準差的平均值

# 1.通過mean計算每行的平均值
# 2.使用cbind添加到數據集中
score <- apply(z, 1, mean)
roster <- cbind(roster,score)

4.劃分等級(A,B,C,D,F)

1 y <- quantile(score,c(.8,.6,.4,.2))

5.根據百分位運算符,創建新的變量等級

1 roster$grade[score >= y[1]] <- A
2 roster$grade[score < y[1] & score >= y[2]] <- B
3 roster$grade[score < y[2] & score >= y[3]] <- C
4 roster$grade[score < y[3] & score >= y[4]] <- D
5 roster$grade[score < y[4]] <- F

6.把學生的姓名拆分成FirstName和LastName

# 1.將該變量以空格的形式進行拆分
# 2.獲取第二個元素為LastName,第一個元素是FirstName
# 3.將這兩項組合到數據集中,並丟棄原始的姓名
name <- strsplit((roster$Student), )
Lastname <- sapply(name, [,2)
Firstname <- sapply(name, [,1)
roster <- cbind(Firstname,Lastname,roster[,-1])

7.根據FirstName和LastName排序

roster <- roster[order(Firstname,Lastname),]

8.使用自定義函數(實現描述性統計量的計算)

 1 mystats <- function(x,parametric=T,print=F){
 2   if(parametric){
 3     center <- mean(x);spread <- sd(x)
 4   }
 5   else{
 6     center <- median(x);spread <- max(x)
 7   }
 8   if(print & parametric){
 9     cat(Mean=,center,\n,SD=,spread,\n)
10   }
11   else if(print & !parametric){
12     cat(Median=,center,\n,MAD=,spread,\n)
13   }
14   result <- list(center=center,spread=spread)
15   return (result)
16 } 
1 # 1.生成服從正態分布的500的隨機樣本
2 # 2.執行語句,獲取y$center和y$spread的值
3 set.seed(1234)
4 x <- rnorm(500)
5 y <- mystats(x)
# 1.或者獲取中位數和mad的值
y <- mystats(x,parametric = F,print = T)

9.switch語句的實現

 1 mydate <- function(type=long){
 2   switch (type,
 3     long = format(Sys.time(),%A %B %d %Y),
 4     short = format(Sys.time(),%m-%d-%y),
 5     cat(type,is not a recognized type\n)
 6   )
 7 }
 8 
 9 # 1.默認調用type為long的參數
10 # 2.如果傳short則調用short格式
11 # 3.否則輸出錯誤信息
12 mydate(long)
13 mydate(short)

10.整合數據

1 # 使用aggregate整合數據,第一個參數是數據集,第二個參數是要整合的列,第三個參數是使用什麽函數進行行數據處理
2 options(digits = 3)
3 attach(mtcars)
4 aggdata <- aggregate(mtcars,by = list(cyl,gear),FUN = mean,na.rm=T)
5 aggdata
6 detach(mtcars)

R語言-基本數據管理