【问题标题】:Lookup table for new column in dataframe in RR中数据框中新列的查找表
【发布时间】:2014-02-12 00:12:50
【问题描述】:

我有一个数据框dat,其中一列dat$QC 包含质量代码,作为一个整数。我想添加一个新列QS,其中包含描述每行质量代码的字符串。

这是我尝试过的:我将质量代码存储在一个向量 qcIDs 中,并将字符串存储在另一个向量 qcStrings 中。然后我遍历这些并相应地填充数据框中的新列。像这样:

qcIDs <- c(1,2,3)
qcStrings <- c('foo', 'bar', 'baz')
for (ii in 1:length(qcIDs)) {
    dat$QS[dat$QC == qcIDs[ii]] <- qcStrings[ii]
}

我是 R 新手,经常阅读有比 for 循环更好的解决问题的方法。有没有更多的 R-ish 方法来解决这个问题?上面的内容是不是和我感觉一样笨拙(感觉很笨拙)?谢谢。

【问题讨论】:

    标签: r for-loop dataframe


    【解决方案1】:

    由于在数据框中以因子结束是最有用的,因此只需使用给定参数创建因子即可。这是一个例子:

    (dat <- data.frame(QC=rep(c(1,2,3), 2)) )
    ##   QC
    ## 1  1
    ## 2  2
    ## 3  3
    ## 4  1
    ## 5  2
    ## 6  3
    

    创建因子的参数:

    qcIDs <- c(1,2,3)
    qcStrings <- c('foo', 'bar', 'baz')
    

    使用这些在dat 中编码一个因子:

    dat$QC <- factor(dat$QC, levels=qcIDs, labels=qcStrings)
    dat
    ##    QC
    ## 1 foo
    ## 2 bar
    ## 3 baz
    ## 4 foo
    ## 5 bar
    ## 6 baz
    

    我没有计时,但它会比任何类型的合并都快。这里没有进行数据比较,只是对对象进行了重新分类。

    【讨论】:

    • 这不仅仅是比merge更好的方法——它是正确的方法。我保留我的答案以供参考,并说明为什么这个答案是正确的。
    • 谢谢,正是我正在寻找的答案!我知道我的方法行得通,但感觉这不是用这种语言处理它的正确方法。我想要一个回答说“这就是我们在 R 中做事的方式”,所以谢谢!
    【解决方案2】:

    使用merge的解决方案:

    lookupQ = data.frame(qcID=c(1,2,3), QS=c('foo', 'bar', 'baz'))
    mergedDat = merge(dat, lookupQ, by.x="QC", by.y="qcID")
    

    【讨论】:

      【解决方案3】:

      使用data.table

      require("data.table")
      lkp <- data.table(qcIDs = 1:3, qcStrings = c('foo', 'bar', 'baz'))
      dat <- data.table(QC = rep(1:3, 10e6))
      setkey(dat,QC)
      setkey(lkp,qcIDs)
      
      result <- lkp[dat]
      
      print(result)
      
      #          qcIDs qcStrings
      #        1:     1       foo
      #        2:     1       foo
      #        3:     1       foo
      #        4:     1       foo
      #        5:     1       foo
      #       ---                
      # 29999996:     3       baz
      # 29999997:     3       baz
      # 29999998:     3       baz
      # 29999999:     3       baz
      # 30000000:     3       baz
      
      
      system.time(lkp[dat])
      # user  system elapsed 
      # 0.63    0.07    0.70 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多