当子列表大小不同且未命名时,如何从 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
我有一个包含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