如何将2个lapply函数链接到R中的子数据帧?

时间:2018-12-20 11:17:18

标签: r list dataframe subset lapply

我有一个包含3个数据帧的列表,另一个包含3个ID向量的列表。我想通过检查第一个数据帧中的ID是否与第一个向量中的ID匹配来对每个数据帧进行子集化。对于第二个df和第二个向量以及第三个df和第三个向量相同。我可以使用lapply来做到这一点,但是我得到了3个列表的列表,每个列表都包含一个数据帧,该数据帧根据ID列表中的3个值中的每个子集进行了子集化。

我想得到一个3个数据帧的列表,第一个是第一个数据帧中ID在第一向量ID中的行的结果,第二个是第二个数据帧中ID在第一向量中的行的结果ID的第二向量...等等

n <- seq(1:20)
id <- paste0("ID_", n)

df1 <-data.frame(replicate(3,sample(0:10,10,rep=TRUE)))
df1$id <- replicate(10, sample(id, 1, replace = TRUE))

df2 <-data.frame(replicate(3,sample(0:10,7,rep=TRUE)))
df2$id <- replicate(7, sample(id, 1, replace = TRUE)) 

df3 <-data.frame(replicate(3,sample(0:10,8,rep=TRUE)))
df3$id <- replicate(8, sample(id, 1, replace = TRUE)) 

list_df <- list(df1, df2, df3)
list_id <- list(c("ID_13", "ID_1", "ID_5"), c("ID_1", "ID_17", "ID_4", 
"ID_9"), c("ID_12", "ID_18"))

subset_df <- lapply(list_df, function(x){
lapply(list_id, function(y) x[x$id %in% y,])
})

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

如Nicola所建议的,您可以在R中使用MapmapplyMapply将多个具有相同长度的向量/列表作为参数,并在向量中传递与相同索引对应的值/列出该功能。

在您的示例中,mapply将把list_df的第一个列表和list_id的1个向量分别传递给df和id并进行所需的处理,并继续进行i = 2,3 ...

mapply(function(df,id){ df[df$id %in% id,]},list_df,list_id,SIMPLIFY = FALSE)