使用 unname 删除 data.frame 的 dimnames 不起作用
remove dimnames of data.frame using unname doesn't work
我试图删除 data.frame 的行名和列名。正如 Jason 所说,这可以通过 unname
然后将行名设置为 NULL
来完成。我注意到手册说使用 unname
和选项 force = T
会一步完成同样的事情:
force logical; if true, the dimnames (names and row names) are
removed even from data.frames.
然而,这对我不起作用:
d <- data.frame(a = c(x1 = 1, x2 = 2), b = c(x1 = 'a', x2 = 'b'))
unname(d, force = T)
# Error in `dimnames<-.data.frame`(`*tmp*`, value = NULL) :
# invalid 'dimnames' given for data frame
这是什么原因?
sessionInfo()
# R version 3.3.1 (2016-06-21)
# Platform: x86_64-pc-linux-gnu (64-bit)
# Running under: Ubuntu 16.04.1 LTS
#
# locale:
# [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C
# [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8
# [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8
# [7] LC_PAPER=en_US.UTF-8 LC_NAME=C
# [9] LC_ADDRESS=C LC_TELEPHONE=C
# [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
#
# attached base packages:
# [1] stats graphics grDevices utils datasets methods base
奇怪。从这里看起来像是一个错误(代码行为与文档不匹配)。
作为解决方法,要删除行名,您需要:
> d <- unname(d)
> rownames(d) <- NULL
> d
1 1 a
2 2 b
最左边的数字列是 R 的标准 data.frame
行编号,适用于没有行名的 data.frame
s。
如果您需要针对您的数据的解决方案,但没有给出为什么 force = T 不起作用的答案。
#read data
d <- data.frame(a = c(x1 = 1, x2 = 2), b = c(x1 = 'a', x2 = 'b'))
#convert to matrix
m1 <- as.matrix(d)
#remove dimnames
m2 <- matrix(mm1, ncol = ncol(d), dimnames = NULL)
m2 #output the data
似乎 unname() 不适用于 data.frame,即使在文档中说它有效。
我试图删除 data.frame 的行名和列名。正如 Jason 所说,这可以通过 unname
然后将行名设置为 NULL
来完成。我注意到手册说使用 unname
和选项 force = T
会一步完成同样的事情:
force logical; if true, the dimnames (names and row names) are removed even from data.frames.
然而,这对我不起作用:
d <- data.frame(a = c(x1 = 1, x2 = 2), b = c(x1 = 'a', x2 = 'b'))
unname(d, force = T)
# Error in `dimnames<-.data.frame`(`*tmp*`, value = NULL) :
# invalid 'dimnames' given for data frame
这是什么原因?
sessionInfo()
# R version 3.3.1 (2016-06-21)
# Platform: x86_64-pc-linux-gnu (64-bit)
# Running under: Ubuntu 16.04.1 LTS
#
# locale:
# [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C
# [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8
# [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8
# [7] LC_PAPER=en_US.UTF-8 LC_NAME=C
# [9] LC_ADDRESS=C LC_TELEPHONE=C
# [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
#
# attached base packages:
# [1] stats graphics grDevices utils datasets methods base
奇怪。从这里看起来像是一个错误(代码行为与文档不匹配)。
作为解决方法,要删除行名,您需要:
> d <- unname(d)
> rownames(d) <- NULL
> d
1 1 a
2 2 b
最左边的数字列是 R 的标准 data.frame
行编号,适用于没有行名的 data.frame
s。
如果您需要针对您的数据的解决方案,但没有给出为什么 force = T 不起作用的答案。
#read data
d <- data.frame(a = c(x1 = 1, x2 = 2), b = c(x1 = 'a', x2 = 'b'))
#convert to matrix
m1 <- as.matrix(d)
#remove dimnames
m2 <- matrix(mm1, ncol = ncol(d), dimnames = NULL)
m2 #output the data
似乎 unname() 不适用于 data.frame,即使在文档中说它有效。