美文网首页
R之基本数据管理

R之基本数据管理

作者: geaus | 来源:发表于2017-08-13 22:58 被阅读0次

    创建新变量
    算术运算符:

    +                                          # 加
    -                                          # 减
    ×                                          # 减
    /                                          # 除
    ^或**                                      # 求幂
    x%%y                                       # 求余
    x%/%y                                      # 整除, 5%/%2=2
    

    可以对数据框的列通过运算得到新的列

    mydata <- data.frame(x1=c(1,2,3), x2=c(2,4,6))
    mydata$sumx <- mydata$x1 + mydata$x2
    mydata$meanx <- (mydata$1 + mydata$2) / 2
    

    变量重编码
    例如,需要将连续型变量修改为类别值;将误编码值替换为正确值。
    逻辑运算符:

    <                                                   # 小于
    <=                                                  # 小于等于
    >                                                   # 大于
    >=                                                  # 小于等于
    ==                                                  # 等于
    !=                                                  # 不等于
    !x                                                  # 非x
    x|y                                                 # x或y
    x&y                                                 # x且y
    isTRUE(x)                                           # x是否为TRUE
    

    举例,连续型变量age编码为(Young, Middle, Old)

    mydate$agecat[mydata$age > 60] <- "Old"
    mydate$agecat[mydata$age <= 60 & mydata$age >30] <- "Middle"
    mydata$agecat[mydata$age <= 30] <- "Young"
    # 更紧凑的写法
    mydata <- within(mydata, {
    agecat<-NA,
    agecat[age>60] <- "Old",
    agecat[age<=60 & age>30] <- "Middle",
    agecat[age<=30] <- "Young"
    })
    

    变量重命名
    如果对现有变量名不满意,可以使用fix()以交互式方式在弹出的对话框中修改变量名

    fix(leadership)
    

    或者,使用reshape包中的rename函数

    rename(dataframe, c(oldname1="newname1", oldname2="newname2", ...))
    # 示例
    library(reshape)
    leadership <- rename(leadership, c(manager="managerID"))
    

    或者通过names()来重命名

    names(leadership)[1] <- "managerID"
    

    缺失值
    在R中,缺失值以NA表示,不可能出现的值以NaN表示。可以使用is.na()判断是否为缺失值。

    y <- c(1,2,3,NA)
    is.na(y)
    > FALSE FALSE FALSE TRUE
    

    分析时,通过na.rm=TRUE来排除缺失值,na.omit()移除所有的包含缺失值的行。

    sumy <- sum(y, na.rm=TRUE)
    newdata <- na.omit(newdata)
    

    日期值
    日期值通常以字符串的形式输入R中,然后转为数值型的日期变量,as.Date(x, "input_format")。

    %d                   #日期,01-31
    %m                   #月份00-12
    %y                   #两位数的年份
    %Y                   #完整的年份
    %a                   #缩写的星期名,Mon
    %A                   #非缩写的星期名,Monday
    %b                   #缩写的月份,Jan
    %B                   #非缩写的月份,January
    

    日期的默认格式为yyyy-mm-dd

    mydates <- as.Date(c("2017-01-01","2017-07-03")) #默认格式
    dates <- as.Date("01/05/93", "%m/%d/%y")
    

    Sys.Date()返回当天日期,date()返回当前日期和时间
    可以通过format()将日期以指定形式打印。

    today <- Sys.Date()
    format(today, "%B %d %Y")
    

    日期可以执行算术运算,例如相减得到相隔的天数。difftime()则可以按星期、天、时、分、秒来表示相隔的时间。

    today <- Sys.Date()
    birthday <- as.Date("2010-01-01")
    difftime(today, birthday, units="weeks")
    

    日期转为字符型变量:strDates <- as.character(dates)
    类型转换

    类型判断                                            类型转换
    is.numeric()                                      as.numeric()
    is.character()                                    as.character()
    is.vector()
    is.matrix()
    is.data.frame()
    is.factor()
    is.logical()
    

    数据排序
    可以使用order()对一个数据框进行排序,默认为升序,在排序变量前加减号则可得降序

    newdata <- leadership[order(leadership$age), ]
    # or
    attach(leadership)
    newdata <- leadership[order(gender, -age), ]
    detach(leadership)
    

    数据集合并
    列合并,可以通过merge()通过一个或多个共有变量进行联结。

    total <- merge(dataframeA, dataframeB, by="ID")
    total <- merge(dataframeA, dataframeB, by=c("ID","Country"))
    

    直接合并列的话,可以使用cbind():total <- cbind(A, B),但需保证行数相同。
    行合并,使用rbind():total <- rbind(A, B),但需要保证数据框拥有相同变量,如不满足可以先进行预处理,将未有变量设置为NA。
    数据集取子集
    选取列子集

    newdata <- leadership[, c(6:10)] # 取6-10列
    # 通过列名选择变量
    myvar <- c("q1", "q2")
    newdata <- leadership[myvar]
    

    删除部分列

    myvar <- names(leadership) %in% c("q3", "q4")
    # 上面可以生成一个logical向量
    newdata <- leadership[!myvar]
    

    选取行子集

    # 选择1-3行
    newdata <- leadership[1:3, ]
    # 选择满足某些条件的行
    newdata <- leadership[which(leadership$gender=="M" & leadership$age > 30), ]
    

    其中,which()给出了向量中值为TRUE的下标,例如which(c(TRUE, TRUE, FALSE))为c(1, 2)
    综合,可以使用subset函数选取满足条件的行及部分列。

    newdata <- subset(leadership, age>=35|age<24, select=c(q1, q2, q3))
    

    随机抽样,使用sample()函数产生所需样本数的随机行号

    # 随机抽取大小为3的样本
    mysample <- mydata[sample(1:nrow(mydata), 3, replace=FALSE), ]
    # 参数replace表示无放回抽样
    

    SQL语句,通过sql语句对数据框完成子集选取

    library(sqldf)
    newdf <- sqldf("select * from mtcars where carb=1 order b y mpg", row.names=TRUE)
    

    相关文章

      网友评论

          本文标题:R之基本数据管理

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