我创建了一个包含两个相同长度的数据列表(字符数组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}}字段?什么是原子矢量?
答案 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)
您的数据结构过于复杂。您需要一个包含三列的数据框:month
,maxTemp
和region
。
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,解决标题问题。