Ошибка применения R: «X» должен иметь имя dimnames

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

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

Ниже приведен пример кода:

> 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

person patrickmdnet    schedule 05.08.2011    source источник


Ответы (2)


Если я правильно вас понял, вы хотели бы использовать apply только для определенных столбцов. Это не то, что могли бы сделать именованные dimnames. Функция применения к матрице или 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» соответствует именам строк. Из-за этого негде хранить имена dimnames (конечно, у них мог бы быть дополнительный атрибут для этого, но его не было). Когда вы вызываете функцию dimnames для data.frame, она просто создает список из атрибутов "row.names" и "names".

person Tommy    schedule 05.08.2011

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

Решение состоит в том, чтобы сначала принудить к матрице, затем назвать 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
person Gavin Simpson    schedule 05.08.2011
comment
Как отмечает @Tommy, с помощью этого подхода вы не можете делать то, что хотите, вы можете только назвать измерение, к которому применяется FUN. Я опубликовал ответ как объяснение того, что имелось в виду под названным битом dimnames вашего вопроса. - person Gavin Simpson; 05.08.2011