我有一个包含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,])
})
感谢您的帮助!
答案 0 :(得分:1)
如Nicola所建议的,您可以在R中使用Map
或mapply
。Mapply
将多个具有相同长度的向量/列表作为参数,并在向量中传递与相同索引对应的值/列出该功能。
在您的示例中,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)