list - 在data.frames中创建新列,其中字母分配给特定数字

时间:2016-08-05 14:18:23

标签: r list dataframe

我有一个包含10个data.frames的列表,每个都有3列。我需要为每个带字母的data.frame创建一个新列。必须在特定的data.frame列上有条件地分配这些字母。

这是我列表中的一个data.frame:

[[10]]
     x   y   z   
1   24  20  15    
2   25  15  25     
3   25  14  20  

必须为其分配新值的列为z。因此,假设15 = S,25 = A,20 = T。

我的data.frame与新列应该是:

[[10]]
     x   y   z  new_col
1   24  20  15   S  
2   25  15  25   A  
3   25  14  20   T

更新

这里我正在尝试使用我的真实数据(遵循@csgillespie建议):

lookup <- data.frame(num = c(-5, -1:8, 13:20, 25:32), let = c('P', 'A', 'E', 'AE', 'ASE', 'AS', 'ASW',
                                                                 'ZQ', 'AW', 'AN', 'OQ', 'AA', 'RT', 'SE', 
                                                                 'S', 'QP', 'W', 'NW', 'N', 'C', 'YE', 'PP',
                                                                 'ZQ', 'CS', 'L', 'CW', 'UW', 'CN'))

lst <- lapply(lst, function(i) 
    cbind(i, new_col=lookup[i$x, 2]))

但是我收到了以下错误,可能是由于查找data.frame上的负数:

  

[.default(xj,i)中的错误:只有0可以与否定混合   标

第二次更新

谢谢@ m-dz!

完成工作:)

2 个答案:

答案 0 :(得分:0)

简单的lapplycbind应该有效。

示例列表

dd = data.frame(x = 1:3, y = 1:3, z = 1:3)
l = list(dd, dd)
look_up = data.frame(value = 1:3, letter = c("A", "B", "Z"))

然后遍历l的每个元素,并使用look_up作为查找表添加新列

lapply(l,function(i) 
  cbind(i, new_col=look_up[i$z, 2]))

答案 1 :(得分:0)

为了便于阅读,我会选择merge()

dd <- data.frame(x = 1:3, y = 1:3, z = 3:1)
dd_list <- list(dd, dd)
lookup <- data.frame(what = 1:3,
                     new_col = c("Q", "W", "E"))
lapply(dd_list, function(dd) merge(dd, lookup, by.x = "z", by.y = "what", sort = FALSE))

编辑:忘记“列表”部分。

编辑2:刚认识到merge()重新排序列并按by列对其进行排序,sort = FALSE处理后者,但保留他们需要的列的原始顺序被重新订购。我会在这里data.table使用其setorder()(或其merge()实现)或此处的任何内容:How does one reorder columns in a data frame?