R 使用'cbind()`、&x27;相同';输入触发不同的行为:行名称是从短变量中找到的,已被丢弃

R 使用'cbind()`、&x27;相同';输入触发不同的行为:行名称是从短变量中找到的,已被丢弃,r,dataframe,cbind,R,Dataframe,Cbind,以下操作工作正常: df1abc #> 1 1 2 3 #> 2 1 2 4 但是,如果我将df1子集df1,即使保持其相同,也会收到一条警告: df2 <- df1[1,] identical(df1, df2) #> [1] TRUE cbind(df2, c=3:4) #> a b c #> 1 1 2 3 #> 2 1 2 4 df2[1]正确 cbind(df2,c=3:4) #>a、b、c #> 1 1 2 3 #> 2 1 2 4 data.

以下操作工作正常:

df1abc
#> 1 1 2 3
#> 2 1 2 4
但是,如果我将df1子集
df1
,即使保持其相同,也会收到一条警告:

df2 <- df1[1,]
identical(df1, df2)
#> [1] TRUE
cbind(df2, c=3:4)
#>   a b c
#> 1 1 2 3
#> 2 1 2 4
df2[1]正确
cbind(df2,c=3:4)
#>a、b、c
#> 1 1 2 3
#> 2 1 2 4
data.frame(…,check.names=FALSE)中的警告:从 短变量和已被丢弃

我没有设置任何行名,这些行名应该是相同的,发生了什么事?

idential()
默认情况下并不总是讲述全部情况:

相同(df1、df2、attrib.as.set=FALSE)
#>[1]错误
该选项更严格地比较属性,尽管在这里,如果我们查看它们,我们只能看到顺序上的差异,这不是我们将看到的观察到的行为的原因

attributes(df1)
#> $names
#> [1] "a" "b"
#> 
#> $class
#> [1] "data.frame"
#> 
#> $row.names
#> [1] 1
attributes(df2)
#> $names
#> [1] "a" "b"
#> 
#> $row.names
#> [1] 1
#> 
#> $class
#> [1] "data.frame"
我们可以尝试使用
row.names()
,但是没有帮助,但是可以使用
.row\u names\u info()
dput()
显示更多信息:

实际上,
cbind.data.frame()
调用
data.frame()
,后者本身调用
。row\u names\u info()
并在触发警告之前测试其符号,
。row\u names\u info(df1)
为负值,而
row\u names\u info(df2)
为正值

将行名称设置为
NULL
“重新初始化”行名称

row.names(df2) <- NULL
cbind(df2, c=3:4)
#>   a b c
#> 1 1 2 3
#> 2 1 2 4
行名称(df2)a b c
#> 1 1 2 3
#> 2 1 2 4
因此,本质上的警告是,我们试图回收具有行名称的
data.frame
的行,因此必须忽略行名称才能进行回收。如果行名称确实不存在,则循环将无声地进行

现在我们可以在这里讨论什么是“没有行名称”的定义和相关性


我知道这个答案并不能回答所有的问题(不是所有的方法,也不是任何的原因),但这就是我的全部

如果您检查row.names,它是不同的
row.names=c(NA,-1L)
,第二个是
row.names=1L
row.names(df2) <- NULL
cbind(df2, c=3:4)
#>   a b c
#> 1 1 2 3
#> 2 1 2 4