美文网首页
[R语言基础] R 变换数据的方法

[R语言基础] R 变换数据的方法

作者: 11的雾 | 来源:发表于2019-07-26 10:12 被阅读0次

    变量预处理的三种方法:

    举例:中国5个省份的GNP,消费和人口的数据如下

    省份 GNP(亿元) 消费(亿元) 人口(万)
    A省 6000 5000 2000
    B省 7200 5800 3600
    C省 7400 6000 3500
    D省 11000 10200 5020
    E省 9200 8500 6100

    首先读入数据。

    > cons <- c(5000,5800,6000,10200,8500)
    > pop <- c(2000,3600,3500,5020,6100)
    > gnp <- c(6000,7200,7400,11000,9200)
    

    现在,加入我们要得到人均GNP和人均储蓄的指标。

    第一种方法:对现有的指标直接进行运算变换。

    > pgnp <- gnp/pop
    > psave <- (gnp-cons)/pop
    

    第二种方法:用transform()函数进行变换。

    > data <- data.frame(gnp, cons, pop)
    > transform(data,pgnp=gnp/pop,psave=(gnp-cons)/pop)
        gnp  cons  pop     pgnp     psave
    1  6000  5000 2000 3.000000 0.5000000
    2  7200  5800 3600 2.000000 0.3888889
    3  7400  6000 3500 2.114286 0.4000000
    4 11000 10200 5020 2.191235 0.1593625
    5  9200  8500 6100 1.508197 0.1147541
    

    第三种方法:用with() 函数进行变换。该函数的用法是with(data, expr, ...),表示对data执行expr运算。

    > (pgnp <- with(data,gnp/pop))
    [1] 3.000000 2.000000 2.114286 2.191235 1.508197
    > (psave <- with(data,(gnp-cons)/pop))
    [1] 0.5000000 0.3888889 0.4000000 0.1593625 0.1147541
    

    你知道还有哪些对数据的函数吗?请留言补充。

    变量重编码的三种方法

    对变量进行重编码是在数据预处理中经常会遇到的一个问题。例如:

    1. 将连续性变量进行分组,变成一个离散型变量。

    2. 将某个值替换成另一个值。

    要重编码可以使用R中的一个或者多个逻辑运算符,逻辑运算符返回的结果为TRUE或FALSE。 R中常用的逻辑运算符如下表所示。

    运算符 说明
    < 小于
    <= 小于等于
    > 大于
    >= 大于等于
    == 严格等于
    != 不等于
    !x 非X
    X&Y X和Y
    X|Y X或Y

    例如,以MASS包中的Cars93数据为例,该数据是关于不同汽车制造商不同款式的汽车价格等数据, 共有27个变量。现在假如我们只关心制造商和价格变量

    > library(MASS)
    > data("Cars93")
    > dat <- data.frame(manu=Cars93$Manufacturer, price=Cars93$Price)
    > head(dat)
       manu price
    1 Acura  15.9
    2 Acura  33.9
    3  Audi  29.1
    4  Audi  37.7
    5   BMW  30.0
    6 Buick  15.7
    

    由于价格的数据是连续型数值变量,假如我们打算将价格按照(0,12)、(12,20)、(20,max(price))分成“cheap”、“okay”和“expensive” 三种类型。

    第一种方法是利用[ ] 将price 分成不同的取值区间,然后用“cheap”、“okay”和“expensive”分别进行替换。

    > dat$pricegrade <- NA
    > dat$pricegrade[dat$price >=20] <- "expensive"
    > dat$pricegrade[dat$price >=12 & dat$price <20] <- "okay"
    > dat$pricegrade[dat$price <12 ] <- "cheap"
    > head(dat)
            manu price pricegrade
    1      Acura  15.9       okay
    2      Acura  33.9  expensive
    3       Audi  29.1  expensive
    4       Audi  37.7  expensive
    5        BMW  30.0  expensive
    6      Buick  15.7       okay
    

    第二种方法是使用within()函数,该函数与with()用法相似, 不同的是该函数可以对数据框进行修改。

    > dat <- data.frame(manu=Cars93$Manufacturer, price=Cars93$Price)
    > dat <- within(dat,{
        pricegrade <- NA
        pricegrade[price>=20] <- "expensive"
        pricegrade[price>=12 & dat$price<20] <- "okay"
        pricegrade[price <12] <- "cheap"
      })
    > head(dat)
       manu price pricegrade
    1 Acura  15.9       okay
    2 Acura  33.9  expensive
    3  Audi  29.1  expensive
    4  Audi  37.7  expensive
    5   BMW  30.0  expensive
    6 Buick  15.7       okay
    

    第三种方法是利用cut()函数先将连续取值的price分为三个区间,然后再利用levels()函数将不同的区间用“cheap”、“okay”和“expensive”分别进行命名。

    > dat <- data.frame(manu=Cars93$Manufacturer, price=Cars93$Price)
    > dat$pricegrade <- cut(dat$price,c(0,12,20,max(dat$price)))
    > levels(dat$pricegrade) <- c("cheap","okay","expensive")
    > head(dat)
       manu price pricegrade
    1 Acura  15.9       okay
    2 Acura  33.9  expensive
    3  Audi  29.1  expensive
    4  Audi  37.7  expensive
    5   BMW  30.0  expensive
    6 Buick  15.7       okay
    

    另外,car包中的recode()函数提供了非常方便的重编码方法。
    例如我们需要对前面的三种类型粉刺额替换成“A”、“B”和“C”。

    > install.packages("car")
    > library(car)
    > recode(dat$pricegrade,"'cheap'='A';'okay'='B';'expensive'='C'")
    [1] B C C C C B C C C C C B A B B B B B C B B C A A B B B C B B A A A B B B C C A B B B B A A A B C C C C C A A B B
    [57] C C C B B A C A B B C B B B C B A A B B C C A A A B A A B B C A B B C C C
    Levels: A B C
    

    变量重命名的三种方法:

    方法一,使用交互式编辑器。

    在命令敞口输入fix(data),R会自动调用一个交互式的编辑器,单击变量名,然后再弹出的对话框中将其重命名,如下图:

    image.png

    方法二: reshape包中有一个rename()函数,可用于修改变量名。其调用格式为:

    rename( dataframe, c(oldname1= "newname1", oldname2 = "newname2", ... ))

    例如,将上面的例子中的dat中的pricegrade重命名为grade。

    > install.packages("reshape")
    > library(reshape)
    > dat1 <- rename(dat, c(pricegrade="grade"))
    > head(dat1)
       manu price     grade
    1 Acura  15.9      okay
    2 Acura  33.9 expensive
    3  Audi  29.1 expensive
    4  Audi  37.7 expensive
    5   BMW  30.0 expensive
    6 Buick  15.7      okay
    

    方法三:直接通过names() 函数来重命名变量。例如:

    > names(dat)
    [1] "manu"       "price"      "pricegrade"
    > names(dat)[3] <- "grade"
    > head(dat)
       manu price     grade
    1 Acura  15.9      okay
    2 Acura  33.9 expensive
    3  Audi  29.1 expensive
    4  Audi  37.7 expensive
    5   BMW  30.0 expensive
    6 Buick  15.7      okay
    

    方法三较为简单,常用。

    相关文章

      网友评论

          本文标题:[R语言基础] R 变换数据的方法

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