mbh*_*h86 17 r matrix subset dataframe rowname
有人可以解释一下为什么我在identical()下面的两行代码(调用)中得到不同的结果吗?这两个对象似乎是相同的对象,但是当我在apply函数中使用它们时,我遇到了一些麻烦:
df <- data.frame(a = 1:5, b = 6:2, c = rep(7,5))
df_ab <- df[,c(1,2)]
df_AB <- subset(df, select = c(1,2))
identical(df_ab,df_AB)
[1] TRUE
apply(df_ab,2,function(x) identical(1:5,x))
a b
TRUE FALSE
apply(df_AB,2,function(x) identical(1:5,x))
a b
FALSE FALSE
Run Code Online (Sandbox Code Playgroud)
Jos*_*ich 13
apply()在调用每列上的函数之前,该函数将其第一个参数强制转换为矩阵.因此,您的数据框被强制转换为矩阵对象.转换的结果是as.matrix(df_AB)具有非null的rownames,而as.matrix(df_ab)不是:
> str(as.matrix(df_ab))
int [1:5, 1:2] 1 2 3 4 5 6 5 4 3 2
- attr(*, "dimnames")=List of 2
..$ : NULL
..$ : chr [1:2] "a" "b"
> str(as.matrix(df_AB))
int [1:5, 1:2] 1 2 3 4 5 6 5 4 3 2
- attr(*, "dimnames")=List of 2
..$ : chr [1:5] "1" "2" "3" "4" ...
..$ : chr [1:2] "a" "b"
Run Code Online (Sandbox Code Playgroud)
因此,当您apply()对列进行子集化时df_AB,会得到一个命名向量,该向量与未命名的向量不同.
apply(df_AB, 2, str)
Named int [1:5] 1 2 3 4 5
- attr(*, "names")= chr [1:5] "1" "2" "3" "4" ...
Named int [1:5] 6 5 4 3 2
- attr(*, "names")= chr [1:5] "1" "2" "3" "4" ...
NULL
Run Code Online (Sandbox Code Playgroud)
与subset()函数对比,该函数使用逻辑向量选择行作为值i.它看起来像是一个带有非缺失值的data.frame的子集,i导致row.names属性中的这种差异:
> str(as.matrix(df[1:5, 1:2]))
int [1:5, 1:2] 1 2 3 4 5 6 5 4 3 2
- attr(*, "dimnames")=List of 2
..$ : chr [1:5] "1" "2" "3" "4" ...
..$ : chr [1:2] "a" "b"
> str(as.matrix(df[, 1:2]))
int [1:5, 1:2] 1 2 3 4 5 6 5 4 3 2
- attr(*, "dimnames")=List of 2
..$ : NULL
..$ : chr [1:2] "a" "b"
Run Code Online (Sandbox Code Playgroud)
您可以使用该.Internal(inspect(x))函数查看data.frames之间差异的所有细节.如果你有兴趣,你可以自己看看.
正如Roland在他的评论中指出的那样,您可以使用该.row_names_info()函数来查看仅在行名称中的差异.
请注意,当i缺失时,结果.row_names_info()为负,但如果您使用非缺失进行子集,则结果为正i.
> .row_names_info(df_ab, type=1)
[1] -5
> .row_names_info(df_AB, type=1)
[1] 5
Run Code Online (Sandbox Code Playgroud)
这些值的含义解释?.row_names_info如下:
Run Code Online (Sandbox Code Playgroud)type: integer. Currently ‘type = 0’ returns the internal ‘"row.names"’ attribute (possibly ‘NULL’), ‘type = 2’ the number of rows implied by the attribute, and ‘type = 1’ the latter with a negative sign for ‘automatic’ row names.
如果要将值1:5与列中的值进行比较,则不应使用,apply因为apply在应用函数之前将数据帧转换为矩阵.由于创建的子集中的行名称[(请参阅@Joshua Ulrich的答案),这些值1:5与包含相同值的命名向量不同.
您应该使用sapply将identical函数应用于列.这避免了将数据帧转换为矩阵:
> sapply(df_ab, identical, 1:5)
a b
TRUE FALSE
> sapply(df_AB, identical, 1:5)
a b
TRUE FALSE
Run Code Online (Sandbox Code Playgroud)
如您所见,在两个数据框中,第一列中的值都相同1:5.
在一个版本(使用[)中,您的列是整数,而在另一个版本(使用subset)中,您的列被命名为整数.
apply(df_ab, 2, str)
int [1:5] 1 2 3 4 5
int [1:5] 6 5 4 3 2
NULL
apply(df_AB, 2, str)
Named int [1:5] 1 2 3 4 5
- attr(*, "names")= chr [1:5] "1" "2" "3" "4" ...
Named int [1:5] 6 5 4 3 2
- attr(*, "names")= chr [1:5] "1" "2" "3" "4" ...
NULL
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
743 次 |
| 最近记录: |