Как обращаться к данным в иерархической структуре данных в R? - PullRequest
2 голосов
/ 05 января 2012

Я создал список, содержащий два списка данных (массив символов 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 я получаю сообщение об ошибке:

Ошибка в результатах исследования $ [[1: 2]] $ maxTemp:

$ оператор недопустим для атомных векторов

Где моя ошибка?Как я могу обратиться к полям из нескольких data.frame, которые сохранены в list из list?А что такое атомные векторы?

Ответы [ 3 ]

4 голосов
/ 05 января 2012

Вы слишком усложняете вещи своей структурой данных. Требуется один фрейм данных с тремя столбцами: 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)))
4 голосов
/ 05 января 2012

[[ может вернуть только один элемент.Я подумал, что [[ вызвало бы ошибку из-за этого, а не из-за ошибки, которую вы видите, но чтение ?"[" говорит о том, что 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компонент, если хотите.

0 голосов
/ 05 января 2012
> 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(...)", вам может понравиться этот вопрос здесь , обращаясь к названию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...