当子列表大小不同且未命名时,如何从 R 中的嵌套列表中获取值?

How do I get values from a nested list in R when the sublists are different sizes and not named?

我有一个包含n个列表的列表,每个列表的长度都不一样。这些列表包含两个字符向量的第三级列表,一个是值的名称,另一个是值。我想提取所有列表中存在相同名称的所有值。这里有一些假数据来说明这个问题。

dput(list(list(list(c("name", "Date"), c("value", "2012-08-17")), 
    list(c("name", "Time"), c("value", "23:12:07 -0800 (PST)"
    )), list(c("name", "Condition"), c("value", "smooth"))), 
    list(list(c("name", "Date"), c("value", "2012-09-23")), list(
        c("name", "ID"), c("value", "23")), list(c("name", "Time"
    ), c("value", "21:56:42 -0800 (PST)")), list(c("name", "Condition"
    ), c("value", "smooth"))), list(list(c("name", "Date"), c("value", 
    "2012-07-01")), list(c("name", "Time"), c("value", "06:05:17 -0800 (PST)"
    )), list(c("name", "Condition"), c("value", "smooth"))), 
    list(list(c("name", "Date"), c("value", "2012-06-07")), list(
        c("name", "ID"), c("value", "23")), list(c("name", "Time"
    ), c("value", "14:07:56 -0800 (PST)")), list(c("name", "Property"
    ), c("value", "hard")), list(c("name", "Condition"), c("value", 
    "smooth")))))

你可以看到列表的长度不同,值的顺序也不同,所以我不能只做 value<-data[[i]][[j]] 因为当我递增 i 时,j 返回为不同的值。 data[[1]][[3]] 会给出 Condition 列表,而 data[[2]][[3]] 会给出 Time 列表。

它们没有命名,所以我无法 ["name"] 获取值。

我试过 values<-sapply(data, function(x) sapply(x, "[[", 2)) 之类的东西,但这只是给了我一个字符向量,其中包含列表中的所有值,这不是很有帮助。

似乎因为在最低级别我有一组键值对,所以我应该能够将其放入某种数据框中,其中列是所有列表中存在的名称(日期、时间、条件)和行是在您遍历列表时对应于名称的值。

我正在考虑一些涉及 grep 的可怕 for 循环,但是有更好的方法吗?

我建议将列表重新命名为更合理的内容。这是一个这样的转变。

newdata <- lapply(
    lapply(data, function(x) 
        lapply(x, function(y) 
            setNames(sapply(y,"[",2), sapply(y,"[",1))
        )
    ), function(x) 
        setNames(sapply(x,"[","value"),sapply(x,"[","name"))
)

这将 return

[[1]]
                  Date                   Time              Condition 
          "2012-08-17" "23:12:07 -0800 (PST)"               "smooth" 

[[2]]
                  Date                     ID                   Time              Condition 
          "2012-09-23"                   "23" "21:56:42 -0800 (PST)"               "smooth" 

[[3]]
                  Date                   Time              Condition 
          "2012-07-01" "06:05:17 -0800 (PST)"               "smooth" 

[[4]]
                  Date                     ID                   Time               Property              Condition 
          "2012-06-07"                   "23" "14:07:56 -0800 (PST)"                 "hard"               "smooth" 

如果您想执行额外的步骤并将其变成 data.frame,您可以使用 dplyr 来帮助

library(dplyr)
rbind_all(lapply(newdata, function(x) data.frame(as.list(x), stringsAsFactors=F)))

这会给

        Date                 Time Condition ID Property
1 2012-08-17 23:12:07 -0800 (PST)    smooth NA       NA
2 2012-09-23 21:56:42 -0800 (PST)    smooth 23       NA
3 2012-07-01 06:05:17 -0800 (PST)    smooth NA       NA
4 2012-06-07 14:07:56 -0800 (PST)    smooth 23     hard