【问题标题】:Subset list of dataframes in RR中数据帧的子集列表
【发布时间】:2014-06-26 16:37:22
【问题描述】:

如何根据条件对数据框列表进行子集化?这可能是重复的,但我在 SO 上找不到它!

样本数据:

data1 <- data.frame(ID=c(1,1),Name1=c(3,2),Name2=c(4,5),Name3=c(6,7),Name4=c(8,9))
data2 <- data.frame(ID=c(2,2),Name4=c(7,3),Name2=c(3,1),Name3=c(2,2),Name1=c(1,1))
data3 <- data.frame(ID=c(3),Name3=c(6),Name1=c(2),Name4=c(3),Name2=c(2))
data4 <- data.frame(ID=c(4,4),Name2=c(5,7),Name3=c(1,1),Name1=c(9,1),Name4=c(3,3))

listData <- list(data1,data2,data3,data4)

通常使用 data.frame 它只是:

df <- data.frame(do.call(rbind, listData))
df[df$ID==3,]

这样我只会得到 ID 号为 3 的行。 如何在列表中进行子集化?谢谢。

编辑:所需的输出将只是单个条目(列表),例如:

[[3]]
   ID Name3 Name1 Name4 Name2
 1  3     6     2     3     2

或者只是一行(data.frame):

    ID Name3 Name1 Name4 Name2
 1  3     6     2     3     2

【问题讨论】:

  • 在这种情况下,您希望结果是什么样的? lapply(listData, function(x) x[x$ID == 3, ]) 之类的东西应该适用于子集。
  • 是的,我已经尝试过你的解决方案,我也得到了空列表。我的列表很大,我只需要匹配的行。
  • 为什么不绑定do.call然后do.call(rbind,lapply(listData,function (x) x[x$ID==3,]))

标签: r


【解决方案1】:

如果您想保留列表中的值,也许可以使用类似的方法:

names(listData) <- seq_along(listData) ## So we can identify which list item it came from
Subs <- lapply(listData, function(x) { y <- x[x$ID == 3, ]; if (nrow(y) == 0) NULL else y })
Subs[!sapply(Subs, is.null)]
$`3`
  ID Name3 Name1 Name4 Name2
1  3     6     2     3     2

【讨论】:

  • 哦,这太理想了!谢谢。
【解决方案2】:

还有:

 listData[mapply(function(x,y) any(x==y),sapply(listData,`[`,1),3)]
 #[[1]]
 # ID Name3 Name1 Name4 Name2
 #1  3     6     2     3     2

【讨论】:

    猜你喜欢
    • 2016-06-11
    • 1970-01-01
    • 2015-04-19
    • 2018-06-08
    • 1970-01-01
    • 2016-03-08
    • 2018-07-08
    • 2021-12-16
    • 2015-04-12
    相关资源
    最近更新 更多