R apply error:'X'必须有名为dimnames

pat*_*net 6 r dataframe

"apply"文档提到"在哪里'X'命名为dimnames,它可以是一个选择维名称的字符向量." 我想在data.frame上仅对特定列使用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
Run Code Online (Sandbox Code Playgroud)

Tom*_*mmy 5

如果我理解正确,您只想在某些列上使用 apply 。这不是命名的暗名所能实现的。矩阵或 data.frame 上的 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
Run Code Online (Sandbox Code Playgroud)

但是,如果您有想要应用的列名称,则可以通过首先仅选择这些列来实现:

n <- c("A","C")
apply(m[,n], 2, sum)
# A  C 
#10 42 
Run Code Online (Sandbox Code Playgroud)

matrix命名的暗名称是暗名称作为列表存储在 a或中的“dimnames”属性中的副作用array。列表的每个组件对应一个维度并且可以命名。这对于多维数组可能更有用......

对于 a data.frame,没有“dimnames”属性。Adata.frame本质上是一个列表,因此列表的“names”属性对应于列名称,额外的“row.names”属性对应于行名称。因此,没有地方可以存储暗名称的名称(当然它们可以有一个额外的属性,但他们没有)。dimnames当您在 data.frame 上调用该函数时,它只是根据“row.names”和“names”属性创建一个列表。