R in action 第四章 学习笔记

作者: Jason数据分析生信教室 | 来源:发表于2019-06-07 13:58 被阅读1次

    第四章 基本数据管理

    0605 22:27 晴

    Dataframe基本操作

    manager <- c(1,2,3,4,5)
    date <- c("10/24/08","10/28/08","10/1/08","10/12/08","5/1/09")
    gender <- c("M","F","F","M","F")
    age <- c(32,45,25,39,99)
    q1 <- c(5,3,3,3,2)
    q2 <- c(4,5,5,3,2)
    q3 <- c(5,2,5,4,1)
    q4 <- c(5,5,5,NA,2)
    q5 <- c(5,5,2,NA,1)
    leadership <- data.frame(manager,date,gender,age,q1,q2,q3,q4,q5, 
                            stringsAsFactors=FALSE)  
    #stringsAsFactors=F 很重要,防止自动把字符转换成factor
                            
    
    leadership$agecat[leadership$age == 99]<-NA
    leadership$agecat[leadership$age > 75]<-"Elder"
    leadership$agecat[leadership$age >= 55 & 
                     leadership$age <= 75]<- "Middle"
    leadership$agecat[leadership$age <55]<- "Young"
    

    以上操作可以被within( ) 替代

    leadership<-within(leadership,{
                        agecat<-NA
                        agecat[age>75]<-"Elder"
                        agecat[age>=55 & age<=75]<-"Middle Aged"
                        agecat[age<55]<-"Young"})
    > names(leadership) # 变量名,当然也可以重新编码
     [1] "manager" "date"    "gender"  "age"     "q1"      "q2"      "q3"      "q4"      "q5"      "agecat" 
    

    改变变量名

    names( )

    > names(leadership)
    [1] "manager" "date"    "gender"  "age"     "q1"      "q2"      "q3"      "q4"      "q5"     
    > names(leadership)[2] <- "testDate"
    > leadership
      manager testDate gender age q1 q2 q3 q4 q5
    1       1 10/24/08      M  32  5  4  5  5  5
    2       2 10/28/08      F  45  3  5  2  5  5
    3       3  10/1/08      F  25  3  5  5  5  2
    4       4 10/12/08      M  39  3  3  4 NA NA
    5       5   5/1/09      F  99  2  2  1  2  1
    > 
    

    缺省值基本操作

    • is.na( ) 检查是否存在缺失值
    > is.na(leadership[, 5:9])
            q1    q2    q3    q4    q5
    [1,] FALSE FALSE FALSE FALSE FALSE
    [2,] FALSE FALSE FALSE FALSE FALSE
    [3,] FALSE FALSE FALSE FALSE FALSE
    [4,] FALSE FALSE FALSE  TRUE  TRUE
    [5,] FALSE FALSE FALSE FALSE FALSE
    
    • 指定缺省值NA
    leadership[age == 99, "age"] <- NA
    # or leadership$age[leadership$age == 99]<-NA
    
    • 排除缺省值
    > x <- c(1, 2, NA, 3)
    > y <- x[1] + x[2] + x[3] + x[4]
    > z <- sum(x)
    > y
    [1] NA
    > z
    [1] NA
    
    > x <- c(1, 2, NA, 3)
    > y <- sum(x, na.rm=TRUE)
    > y
    [1] 6
    
    • 使用 na.omit( ) 删除不完整的数据
    > newdata <- na.omit(leadership)
    > newdata
      manager testDate gender age q1 q2 q3 q4 q5 agecat
    1       1 10/24/08      M  32  5  4  5  5  5  Young
    2       2 10/28/08      F  45  3  5  2  5  5  Young
    3       3  10/1/08      F  25  3  5  5  5  2  Young
    5       5   5/1/09      F  99  2  2  1  2  1  Elder
    

    时间日期的基本操作

    • 计算日期差
    startdate <- as.Date("2004-02-13")
    enddate   <- as.Date("2009-06-22")
    enddate - startdate
    
    today <- Sys.Date()
    dob <- as.Date("1956-10-12")
    difftime(today, dob, units="weeks")
    
    • 更加详细的时间操作包
      lubridate, timeDate

    数据排序

    > newdata <- leadership[order(leadership$age),]
    > newdata
      manager testDate gender age q1 q2 q3 q4 q5 agecat
    3       3  10/1/08      F  25  3  5  5  5  2  Young
    1       1 10/24/08      M  32  5  4  5  5  5  Young
    4       4 10/12/08      M  39  3  3  4 NA NA  Young
    2       2 10/28/08      F  45  3  5  2  5  5  Young
    5       5   5/1/09      F  99  2  2  1  2  1  Elder
    

    数据框合并

    total <- merge(dataframeA, dataframeB, by="ID")
    
    total <- cbind(A, B)  #横向合并
    total <- rbind(dataframeA, dataframeB)
     #纵向合并,必须要有相同的变量,如果没有,就需要删除多余变量或者添加NA
    

    数据集子集

    myvars <- names(leadership) %in% c("q3", "q4")
    newdata <- leadership[!myvars]
    

    短短的两条代码,目的很简单,但逻辑上需要绕一下。

    1. 选择了leadership的变量名
    2. %in%提取其中的 "q3","q4"变量
      综合1,2就是把变量名“q3","q4"编制成myvars
    3. 把不含myvars也就是“q3","q4"变量的数据重新整合成一个新的数据newdata

    举一反三: 删除列是这样的,删除行怎么办呢
    names( ) 换成 rownames( ) 就OK了

    其他办法

    leadership$q3 <- leadership$q4 <- NULL
    
    leadership$date <- as.Date(leadership$date, "%m/%d/%y")
    startdate <- as.Date("2009-01-01")
    enddate <- as.Date("2009-10-31")
    newdata <- leadership[which(leadership$date >= startdate &
                        leadership$date <= enddate),]
    
    • subset( ) 函数

    需要经常使用这个函数,还是比较便利的

    newdata <- subset(leadership, age >= 35 | age < 24,
                     select=c(q1, q2, q3, q4))
    newdata <- subset(leadership, gender=="M" & age > 25,
                     select=gender:q4))
    
    • 随机抽样
      随机抽三行
    mysample <- leadership[sample(1:nrow(leadership), 3, replace=FALSE),]
    

    以上
    0606 16:49

    相关文章

      网友评论

        本文标题:R in action 第四章 学习笔记

        本文链接:https://www.haomeiwen.com/subject/pjbmxctx.html