R从数据帧列表中提取匹配值

时间:2015-06-03 15:41:03

标签: r list dataframe

我有相对大量的数据存储在具有多列的数据框列表中。 对于列表中的每个元素,我希望针对引用检查一列,如果存在,则提取在同一元素的另一列中保存的值并放置在新的汇总矩阵中。

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列。

我希望这很清楚。

谢谢,

马特

1 个答案:

答案 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))