我有相对大量的数据存储在具有多列的数据框列表中。 对于列表中的每个元素,我希望针对引用检查一列,如果存在,则提取在同一元素的另一列中保存的值并放置在新的汇总矩阵中。
e.g。使用以下示例代码:
add1 = c("N1","N1","N1")
coords1 = c(1,2,3)
vals1 = c("a","b","c")
extra1 = c("x","y","x")
add2 = c("N2","N2","N2","N2")
coords2 = c(2,3,4,5)
vals2 = c("b","c","d","e")
extra2 = c("z","y","x","x")
add3 = c("N3","N3","N3")
coords3 = c(1,3,5)
vals3 = c("a","c","e")
extra3 = c("z","z","x")
df1 <- data.frame(add1, coords1, vals1, extra1)
df2 <- data.frame(add2, coords2, vals2, extra2)
df3 <- data.frame(add3, coords3, vals3, extra3)
list_all <- list(df1, df2, df3)
coordinate.extract <- unique(unlist(lapply(list_all, "[", 1)))
my_matrix <- matrix(0, ncol = length(list_all)
, nrow = (length(coordinate.extract)))
my_matrix_new <- cbind(as.character(coordinate.extract)
, my_matrix)
我想最终:
my_matrix_new = V1 V2 V3 V4
1 a a
2 b b
3 c c c
4 d
5 e e
即。根据第二列的值选择每个列表元素的第3列。
我希望这很清楚。
谢谢,
马特
答案 0 :(得分:1)
我会使用data.frame
,因为有混合类。您可以尝试使用merge
Reduce
来获得预期的输出。选择第2列和第3列,在每个list
元素中,将第2列的列名更改为所有列表元素merge
中的相同列表名称,如果需要,请将NA
元素替换为''
lst1 <- lapply(list_all, function(x) {names(x)[2] <- 'V1';x[2:3] })
res <- Reduce(function(...) merge(..., by='V1', all=TRUE), lst1)
res[-1] <- lapply(res[-1], as.character)
res[is.na(res)] <- ''
res
# V1 vals1 vals2 vals3
#1 1 a a
#2 2 b b
#3 3 c c c
#4 4 d
#5 5 e e
我们可以更改列名
names(res) <- paste0('V', seq_along(res))