【问题标题】:How to chain 2 lapply functions to subset dataframes in R?如何将 2 个 lapply 函数链接到 R 中的子集数据帧?
【发布时间】:2019-05-20 21:54:04
【问题描述】:

我有一个包含 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,])
})

感谢您的帮助!

【问题讨论】:

  • 您在寻找Map(function(x,y) x[x$id %in% y,],list_df,list_id)吗?
  • abso-freaking-lutely!!非常感谢,我不知道这个功能!
  • 另外,由于您使用的是sample(),您应该使用set.seed() 以获得更好的可重现示例。
  • 感谢您的建议!

标签: r list dataframe subset lapply


【解决方案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)

【讨论】:

    猜你喜欢
    • 2018-06-08
    • 2019-07-08
    • 1970-01-01
    • 2020-02-18
    • 2020-09-11
    • 2014-12-02
    • 2020-02-17
    • 1970-01-01
    • 2020-04-04
    相关资源
    最近更新 更多