如何处理R中分层数据结构中的数据?

时间:2012-01-05 13:45:13

标签: list r data-structures

我创建了一个包含两个相同长度的数据列表(字符数组region和列表results)的列表。 (我试图管理data.frame中的数据,但是将数据添加到data.frame似乎很复杂。)

study = list(
    region  = character(),
    results = list()
)

study$region[1] = "Hamburg"
study$results[[1]]  = data.frame(month=c(1:5), maxTemp=c(-12, -1, 3, 10, 23))


study$region[2]    = "Bremen"
study$results[[2]]  = data.frame(month=c(1:5), maxTemp=c(-9, -1, 6, 10, 21))

str(study)

print("Maximum temperature of all study regions:")
max(study$results[[1:2]]$maxTemp)

我想找出所有地区所有时间点的最高温度。我可以使用例如一个接一个地解决每个区域。 max(study$results[[1]]$maxTemp,但当我尝试解决所有地区max(study$results[[1:2]]$maxTemp时,我收到错误消息:

  

学习错误$ results [[1:2]] $ maxTemp:

     

$ operator对原子矢量无效

我的错误在哪里?如何处理data.frame list list中保存的多个{{1}}字段?什么是原子矢量?

3 个答案:

答案 0 :(得分:4)

[[只能返回一个元素。我认为[[会因此而抛出错误,而不是您看到的错误,但是阅读?"["会告诉R对您的调用做什么并解释行为(来自?"[" }):

  

递归(类似列表)对象:   ....

 ‘[[’ can be applied recursively to lists, so that if the single
 index ‘i’ is a vector of length ‘p’, ‘alist[[i]]’ is equivalent to
 ‘alist[[i1]]...[[ip]]’ providing all but the final indexing
 results in a list.

您的错误原因是:

> study$results[[c(1,2)]]
[1] -12  -1   3  10  23

表示R确实这样做了

> study$results[[1]][[2]]
[1] -12  -1   3  10  23

即。返回第一个数据帧的第二个组件(列),这是一个原子向量,因为R会丢弃空的维度。 $不能用于原子向量,因此错误。

如果您要遍历study$results列表,lapply()sapply()是您的朋友:

> lapply(study$results, function(y) max(y[, "maxTemp"], na.rm = TRUE))
[[1]]
[1] 23

[[2]]
[1] 21

> sapply(study$results, function(y) max(y[, "maxTemp"], na.rm = TRUE))
[1] 23 21

如果您在$results中的组件上弹出了名称,您也会在输出中输入它们:

> names(study$results) <- study$region
> lapply(study$results, function(y) max(y[, "maxTemp"], na.rm = TRUE))
$Hamburg
[1] 23

$Bremen
[1] 21

> sapply(study$results, function(y) max(y[, "maxTemp"], na.rm = TRUE))
Hamburg  Bremen 
     23      21

更容易使用,如果您愿意,则不需要$region组件。

答案 1 :(得分:4)

您的数据结构过于复杂。您需要一个包含三列的数据框:monthmaxTempregion

n_months <- 5
(study <- data.frame(
  month   = rep.int(1:n_months, 2),
  maxTemp = c(12, -1, 3, 10, 23, -9, -1, 6, 10, 21),
  region  = rep(c("Hamburg", "Bremen"), each = n_months)
))

   month maxTemp  region
1      1      12 Hamburg
2      2      -1 Hamburg
3      3       3 Hamburg
4      4      10 Hamburg
5      5      23 Hamburg
6      1      -9  Bremen
7      2      -1  Bremen
8      3       6  Bremen
9      4      10  Bremen
10     5      21  Bremen

现在,您所有地区的最高温度仅为max(study$maxTemp)。不需要很难编制索引。


如果你真的必须坚持使用现有的数据结构,那么获得最高温度的等效命令是

max(sapply(study, function(x) max(x$region$maxTemp)))

答案 2 :(得分:0)

> max(data.frame(study$results[[2]]$maxTemp, study$result[[1]]$maxTemp))
[1] 23

让我们分析

> dput(data.frame(study$results[[2]]$maxTemp, study$result[[1]]$maxTemp))
structure(list(study.results..2...maxTemp = c(-9, -1, 6, 10, 
21), study.result..1...maxTemp = c(-12, -1, 3, 10, 23)), .Names = c("study.results..2...maxTemp", 
"study.result..1...maxTemp"), row.names = c(NA, -5L), class = "data.frame")
#
# NOT ATOMIC VECTOR HERE, look you can find there maxTemp --> it will work!

将其与

进行比较
>dput(study$results[[1:2]])
c(-12, -1, 3, 10, 23)              # ATOMIC VECTOR! Cannot use `$` here...

现在找到原子矢量:

> Filter(is.atomic, study)
$region
[1] "Hamburg" "Bremen"

同样"?Position(...)",您可能会喜欢这个问题here,解决标题问题。