【问题标题】:Return row names of dataframe meeting condition stored in list using lapply使用 lapply 返回存储在列表中的数据框满足条件的行名
【发布时间】:2020-06-09 11:46:54
【问题描述】:

我有一个包含数据框的列表,每个数据框都有不同的观察结果。这是我正在使用的示例:

set.seed(9)
df<- data.frame(x1 = round(runif(80, 0, 5)),
                x2 = round(runif(80, 0, 15)),
                x3 = sample(letters[1:8], 80, replace = TRUE))
my.list <- vector(mode = "list", length = 8)                            
my.list <- lapply(unique(df$x3), function(x) {subset(df, x3 == x)}) 

我想要实现的是找到满足条件的每个数据框的行名。使用lapply() 最接近我想要实现的目标是使用下面的代码。但是,这会返回 NA;我不确定为什么会这样。

> lapply(my.list, function(x) {x <- row.names(x[which(x[,1:2] < 5), ]); x})[[1]]
 [1] "1"    "5"    "11"   "22"   "46"   "53"   "61"   "63"   "64"   "79"   "80"   "NA"   "NA.1" "NA.2" "NA.3"

需要做什么才能只返回行名?

【问题讨论】:

  • 您可以在您的代码中进行此更改,然后 na 将消失。 lapply(my.list, function(x) {x &lt;- row.names(x[which(x[,1:2][1] &lt; 5), ]); x})注意:我在which语句中添加了[1]

标签: r list apply lapply


【解决方案1】:

你可以这样做:

v = lapply(my.list, function(x) {
                y <- rowSums(x[,1:2] < 5) == 2
                names(y[y == T])
          })

print(v)

[[1]]
[1] "1"  "13" "65"

[[2]]
[1] "20" "48" "58" "63"

[[3]]
[1] "3"  "43"

[[4]]
[1] "5"  "12" "24" "77" "80"

[[5]]
[1] "8"  "31"

[[6]]
[1] "25"

[[7]]
[1] "17" "19" "23" "49" "60" "62"

[[8]]
[1] "15" "30" "40"

【讨论】:

  • 谢谢,一个不错的选择! @YOLO
【解决方案2】:

你必须改变你的lapply(my.list, function(x) {x &lt;- row.names(x[which(x[,1:2] &lt; 5), ]); x})

在下面确保只有子集列表进入 row.names 调用

lapply(my.list, function(x) {x <- row.names(x[which(x[,1:2][1] < 5), ]); x})

【讨论】:

  • 谢谢。如此简单,如此优雅。 @XXavier
猜你喜欢
  • 2017-09-15
  • 1970-01-01
  • 2021-01-22
  • 2018-10-23
  • 1970-01-01
  • 2020-05-16
  • 1970-01-01
  • 2021-10-24
  • 2018-03-10
相关资源
最近更新 更多