我有一个包含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!
完成工作:)
答案 0 :(得分:0)
简单的lapply
和cbind
应该有效。
示例列表
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?