R应用错误:'X'必须具有命名维度名称

6

"apply"的文档中提到,“如果 'X' 拥有命名的dimnames,那么它可以是选择维度名称的字符向量。”我想在数据框上仅使用特定列的 "apply" 方法。我可以使用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
2个回答

5

如果我理解你的意思正确,你希望仅在某些列上使用apply。这并不是命名dimnames所能实现的。矩阵或数据框上的apply函数始终适用于所有行或所有列。命名dimnames允许您选择使用行或列名称而不是“正常”的12

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"属性中以列表形式存储。列表的每个组件对应一个维度,可以被命名。这对于多维数组可能更有用... 对于data.frame,没有"dimnames"属性。data.frame本质上是一个列表,因此列表的"names"属性对应列名,并且额外的"row.names"属性对应行名。由于这个原因,没有地方存储dimnames的名称(当然他们可以有一个额外的属性来存储它们,但他们没有这样做)。当你在data.frame上调用dimnames函数时,它只是从"row.names"和"names"属性创建一个列表。

2
问题在于由于某些原因您无法直接操作 x 的 dimnames,并且 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

正如@Tommy所指出的那样,您无法通过此方法实现您想要的操作,您只能命名应用“FUN”的维度。我发布了答案,解释了您在问题中提到的命名dimnames位的含义。 - Gavin Simpson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接