【问题标题】:Loop over named list of dfs, test condition on df's column, if true return name of list element循环 dfs 的命名列表,df 列上的测试条件,如果为 true,则返回列表元素的名称
【发布时间】:2013-02-01 00:45:59
【问题描述】:

我有一个 data.frame 对象的命名列表 (training_data)。每个 data.frame 对象都将基于“x”列进行测试,如果测试通过,则应该返回该 data.frame 对象的名称。

在下面的情况下,应该返回“a”和“b”:

df <- data.frame(x=1:10, y=1:10)
df1 <- data.frame(x=11:20, y=11:20)
training_data <- list(df, df, df1, df1)
names(training_data) <- c("a", "b", "c", "d")

pos <- lapply(training_data, function(data) {
                                 if(data$x==1)
                                    ["return the name of the data.frame object in hand"]
                              })

我的问题是如何准确地确定在 lapply 的任何迭代中当前正在处理的对象的名称,以及如何返回该名称以使其进入“pos”列表。

问候

【问题讨论】:

  • dput一些示例数据。如果你不明白,read this。 ..我从来没有在lapply 函数中看到if,你确定你不想要ifelse(它是矢量化的)吗?

标签: r list loops lapply named


【解决方案1】:

此处无需使用lapply,您可以访问您的列表,例如:

training_data[['pos']] 

这将使您能够访问名为 'pos' 或 posxx 的 data.frame...

编辑在 OP 澄清后

我在列表名称中使用 lapply ,我和我使用与上面相同的方式访问主列表

pos <- lapply(names(training_data), function(data) {
  if(training_data[[data]]$x==1)        ## here your condition is not correct
    data

})

  [[1]]
[1] "a"

[[2]]
[1] "b"

[[3]]
NULL

[[4]]
NULL

您可以使用类似

的方式删除 NULL 元素
unlist(pos)
[1] "a" "b"

但我认为如果您使用返回命名列表的sapply,您会在这里获得更好的输出。

【讨论】:

  • training_data 是一个包含多个 data.frame 对象的列表。条件是放置在 data.frame 对象中包含的标签字段上。
  • 没有。您问如何“确定当前正在处理的对象的名称”......现在“标签字段包含在 data.frame 对象中”?你是什​​么意思?列名?
  • 没有。不是列名。列表的每个元素(在本例中为数据框对象)都被命名。我想判断这个data.frame的名字是不是满足以下条件:if(x$label=="pos") then return this data.frame object的名字。
  • @Shahzad 我认为您确实需要给出一个具有预期结果的可重现示例。
  • @Shahzad 我们想帮助你,但你没有付钱给我们——你有责任提供明确定义的起始数据以及你想要的结果。 please read this carefully :)
猜你喜欢
  • 1970-01-01
  • 2019-06-25
  • 2020-09-20
  • 2014-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多