Manipulating Data-重编码数据

作者: 杏月阿六 | 来源:发表于2017-09-29 22:52 被阅读20次

    问题

    你想重新编码数据或从现有的数据中计算生产新的数据列。

    方案

    下面的例子将使用这些数据:

    data <- read.table(header=T, text='
     subject sex control cond1 cond2
           1   M     7.9  12.3  10.7
           2   F     6.3  10.6  11.1
           3   F     9.5  13.1  13.8
           4   M    11.5  13.4  12.9
    ')
    

    重新编码分类变量

    最简单的方法是使用plyr包里的revalue()mapvalues()。这可以令M1F2,并把它放在一个新生产的列。注意,这两个函数均保存数据类型:如果输入一个因子,输出将会是一个因子;如果输入是一个字符串向量,输出将会是一个字符串向量。

    library(plyr)
    
    # 下面两行是等价的:
    data$scode <- revalue(data$sex, c("M"="1", "F"="2"))
    data$scode <- mapvalues(data$sex, from = c("M", "F"), to = c("1", "2"))
    data
    #>   subject sex control cond1 cond2 scode
    #> 1       1   M     7.9  12.3  10.7     1
    #> 2       2   F     6.3  10.6  11.1     2
    #> 3       3   F     9.5  13.1  13.8     2
    #> 4       4   M    11.5  13.4  12.9     1
    
    # data$sex是一个因子,因此data$scode也是因子
    

    详见Manipulating Data - 映射向量的值、Manipulating Data - 重命名因子水平

    如果你不想依赖plyr,你可以使用R内置函数:

    data$scode[data$sex=="M"] <- "1"
    data$scode[data$sex=="F"] <- "2"
    
    # 把列转换为因子
    data$scode <- factor(data$scode)
    data
    #>   subject sex control cond1 cond2 scode
    #> 1       1   M     7.9  12.3  10.7     1
    #> 2       2   F     6.3  10.6  11.1     2
    #> 3       3   F     9.5  13.1  13.8     2
    #> 4       4   M    11.5  13.4  12.9     1
    

    另一种方法是使用match函数:

    oldvalues <- c("M", "F")
    newvalues <- factor(c("g1","g2"))  # 因子
    
    data$scode <- newvalues[ match(data$sex, oldvalues) ]
    data
    #>   subject sex control cond1 cond2 scode
    #> 1       1   M     7.9  12.3  10.7    g1
    #> 2       2   F     6.3  10.6  11.1    g2
    #> 3       3   F     9.5  13.1  13.8    g2
    #> 4       4   M    11.5  13.4  12.9    g1
    

    将一个连续变量编码为分类变量

    标记这些值,control值小于7为“low”,大于或等于7为“high”:

    data$category[data$control< 7] <- "low"
    data$category[data$control>=7] <- "high"
    
    # 把列转换为因子
    data$category <- factor(data$category)
    data
    #>   subject sex control cond1 cond2 scode category
    #> 1       1   M     7.9  12.3  10.7    g1     high
    #> 2       2   F     6.3  10.6  11.1    g2      low
    #> 3       3   F     9.5  13.1  13.8    g2     high
    #> 4       4   M    11.5  13.4  12.9    g1     high
    

    cut函数,可以指定上下限:

    data$category <- cut(data$control,
                         breaks=c(-Inf, 7, 9, Inf),
                         labels=c("low","medium","high"))
    data
    #>   subject sex control cond1 cond2 scode category
    #> 1       1   M     7.9  12.3  10.7    g1   medium
    #> 2       2   F     6.3  10.6  11.1    g2      low
    #> 3       3   F     9.5  13.1  13.8    g2     high
    #> 4       4   M    11.5  13.4  12.9    g1     high
    

    默认情况下,范围是左边开放、右边关闭,如(7,9]。使用right= FALSE可以设置成左边关闭、右边开放,像[7、9)。

    计算得到一个新的连续变量

    假设您想添加一个新列,为三个量的和。

    data$total <- data$control + data$cond1 + data$cond2
    data
    #>   subject sex control cond1 cond2 scode category total
    #> 1       1   M     7.9  12.3  10.7    g1   medium  30.9
    #> 2       2   F     6.3  10.6  11.1    g2      low  28.0
    #> 3       3   F     9.5  13.1  13.8    g2     high  36.4
    #> 4       4   M    11.5  13.4  12.9    g1     high  37.8
    

    原文链接:http://www.cookbook-r.com/Manipulating_data/Recoding_data/

    相关文章

      网友评论

      • 王诗翔:很有用。我一般用的就是默认的,这里提供的包非常实用,以前不知道怎么用。
      • 王诗翔:很认真,加油。

      本文标题:Manipulating Data-重编码数据

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