如果我用矩阵索引所有整数的data.frame,我得到预期的结果。
df <- data.frame(c1=1:4, c2=5:8)
df1
# c1 c2
#1 1 5
#2 2 6
#3 3 7
#4 4 8
df1[matrix(c(1:4,1,2,1,2), nrow=4)]
# [1] 1 6 3 8
如果data.frame有一列字符,那么结果就是所有字符,即使我只是为整数列编制索引。
df2 <- data.frame(c0=letters[1:4], c1=1:4, c2=5:8)
df2
# c0 c1 c2
#1 a 1 5
#2 b 2 6
#3 c 3 7
#4 d 4 8
df2[matrix(c(1:4,2,3,2,3), nrow=4)]
# [1] "1" "6" "3" "8"
class(df[matrix(c(1:4,2,3,2,3), nrow=4)])
# [1] "character"
df2[1,2]
# [1] 1
我最好的猜测是,R太忙了,无法通过答案来检查它们是否都来自某个班级。任何人都可以解释为什么会这样吗?
答案 0 :(得分:4)
在?Extract
中,描述了通过数字矩阵进行索引是针对矩阵和数组的。因此,这种索引首先适用于数据框可能会令人惊讶。
但是,如果我们查看[.data.frame
(getAnywhere(`[.data.frame`)
)的代码,我们会看到使用data.frame
中的matrix
从i
中提取元素时},data.frame
首先被强制转移到matrix
as.matrix
:
function (x, i, j, drop = if (missing(i)) TRUE else length(cols) ==
1)
{
# snip
if (Narg < 3L) {
# snip
if (is.matrix(i))
return(as.matrix(x)[i])
然后查看?as.matrix
:
“如果只有原子列和任何非(数字/逻辑/复杂)列”,数据帧的方法将返回字符矩阵。
因此,由于“df2”中的第一列属于character
类,as.matrix
会在提取之前将整个数据帧强制转换为character
矩阵。