R применить ошибку: 'X' должен иметь именованные имена - PullRequest
6 голосов
/ 05 августа 2011

В документации «apply» упоминается, что «где« X »назвал dimnames, это может быть вектор символов, выбирающий имена измерений».Я хотел бы использовать apply для data.frame только для определенных столбцов.Могу ли я использовать для этого функцию dimnames?

Я понимаю, что могу использовать subset () X для включения только интересующих столбцов, но я хочу лучше понять "именованные имена".

Нижеэто пример кода:

> x <-  data.frame(cbind(1,1:10))
> apply(x,2,sum)
X1 X2
10 55
> apply(x,c('X2'),sum)
Error in apply(x, c("X2"), sum) : 'X' must have named dimnames
> dimnames(x)
[[1]]
 [1] "1"  "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9"  "10"

[[2]]
[1] "X1" "X2"
> names(x)
[1] "X1" "X2"
> names(dimnames(x))
NULL

Ответы [ 2 ]

4 голосов
/ 05 августа 2011

Если я правильно вас понимаю, вы хотели бы использовать команду apply только на определенных столбцах. Это , а не , что могли бы сделать именованные димны. Функция apply для матрицы или data.frame всегда применяется к всем строкам или всем столбцам. Названные имена dimnames позволяют вам выбрать использование строк или столбцов по имени вместо «обычных» 1 и 2:

m <- matrix(1:12,4, dimnames=list(foo=letters[1:4], bar=LETTERS[1:3]))
apply(m, "bar", sum)  # Use "bar" instead of 2 to refer to the columns

Однако, если у вас есть имена столбцов, к которым вы хотите обратиться, вы можете сделать это, сначала выбрав только эти столбцы:

n <- c("A","C")
apply(m[,n], 2, sum)
# A  C 
#10 42 

Именованные dimnames являются побочным эффектом того, что dimnames хранятся в виде списка в атрибуте "dimnames" в matrix или array. Каждый компонент списка соответствует одному измерению и может быть назван. Это, вероятно, более полезно для многомерных массивов ...

Для data.frame атрибут "dimnames" отсутствует. data.frame - это, по сути, список, поэтому атрибуты «names» списка соответствуют именам столбцов, а дополнительный атрибут «row.names» соответствует именам строк. Из-за этого нет места для хранения names dimnames (у них, конечно, мог бы быть дополнительный атрибут, но они этого не сделали). Когда вы вызываете функцию dimnames для data.frame, она просто создает список из атрибутов "row.names" и "names".

2 голосов
/ 05 августа 2011

Проблема в том, что по какой-то причине вы не можете напрямую манипулировать dimnames x, и x будет приведен к матрице, которая не сохраняет именованные dimnames.

Решение состоит в том, чтобы сначала привести к матрице, затем назвать dimnames и затем использовать apply()

> X <- as.matrix(x)
> str(X)
 num [1:10, 1:2] 1 1 1 1 1 1 1 1 1 1 ...
 - attr(*, "dimnames")=List of 2
  ..$ : chr [1:10] "1" "2" "3" "4" ...
  ..$ : chr [1:2] "X1" "X2"
> dimnames(X) <- list(C1 = dimnames(x)[[1]], C2 = dimnames(x)[[2]])
> str(X)
 num [1:10, 1:2] 1 1 1 1 1 1 1 1 1 1 ...
 - attr(*, "dimnames")=List of 2
  ..$ C1: chr [1:10] "1" "2" "3" "4" ...
  ..$ C2: chr [1:2] "X1" "X2"
> apply(X, "C1", mean)
  1   2   3   4   5   6   7   8   9  10 
1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0 5.5 
> rowMeans(X)
      1   2   3   4   5   6   7   8   9  10 
1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0 5.5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...