R:数据帧colnames未应用于数据帧



长期用户,首次发布。当我查看数据时,发生了一些奇怪的事情。我制作了一个data.frame,添加了列,对它们进行了操作,并重命名了它们。当我查看colnames时,重命名似乎起到了作用。但当我查看df时,实际上只有一列被重命名了。

这是一个可重复的例子。

var_tab <- data.frame(coef=c(1:4), p=rep(0.1, 4))
var_tab <- cbind (var_tab, c("one", "two", "three", "four"))
var_tab[4] <- "three"
> var_tab
coef   p c("one", "two", "three", "four")    V4
1    1 0.1                              one three
2    2 0.1                              two three
3    3 0.1                            three three
4    4 0.1                             four three
> colnames(var_tab)
[1] "coef"                                    
[2] "p"                                       
[3] "c("one", "two", "three", "four")"
[4] "V4"

一切如预期。。。直到我重命名这些列。colname并没有全部正确显示!colname发生了变化,但它们只出现在第三个变量中,而不是第四个变量中。

var_tab[4] <- ifelse(var_tab[4] == var_tab[3], 1, 0)
colnames(var_tab)[3:4] <- c("model", "base")
> var_tab
coef   p model V4
1    1 0.1   one  0
2    2 0.1   two  0
3    3 0.1 three  1
4    4 0.1  four  0
> colnames(var_tab)
[1] "coef"  "p"     "model" "base" 

这个问题可以通过在重新计算之前重命名列4来解决,因此这个问题很容易避免。

colnames(var_tab)[3:4] <- c("model", "base")
var_tab[4] <- ifelse(var_tab[4] == var_tab[3], 1, 0)
> colnames(var_tab)
[1] "coef"  "p"     "model" "base" 
> var_tab
coef   p model base
1    1 0.1   one    0
2    2 0.1   two    0
3    3 0.1 three    1
4    4 0.1  four    0

虽然我可以避免这个问题,但我仍然不明白是什么解决了这个问题。我找不到任何其他关于这个问题的提法。它模糊地让我想起了R的浮点数问题。这里有人知道是什么原因导致我的colname没有应用到数据帧吗?

提前感谢您的帮助!

设置后

var_tab <- data.frame(coef=c(1:4), p=rep(0.1, 4))
var_tab <- cbind (var_tab, c("one", "two", "three", "four"))
var_tab[4] <- "three"

注意之间的差异

str(var_tab[4] == var_tab[3])
str(var_tab[[4]] == var_tab[[3]]) 

第一个返回一个data.frame。当你把一个只有一列的数据.frame分配给一个数据帧的一列时,事情就会变得奇怪。外部数据帧具有包含数据帧的列的名称。该内部数据帧的列有自己的名称。

如果你给data.frame的一列指定一个干净的向量,那么你就没有这个问题。

所以你应该使用

var_tab[4] <- ifelse(var_tab[[4]] == var_tab[[3]], 1, 0)
colnames(var_tab)[3:4] <- c("model", "base")

最新更新