R data.frame字符列的行为不符合预期

时间:2012-12-05 19:40:08

标签: r

我遇到了data.frame的问题。为了使它变得非常简单,我从

开始
    test<-data.frame(char=character(10), numr=numeric(10))
    test$char[1]<-"ery"

结果是

    Warning message:In `[<-.factor`(`*tmp*`, 1, value = c(NA, 1L, 1L, 1L, 1L, 1L, 1L,  :
   invalid factor level, NAs generated

如果我mode(test$char),我会[1] "numeric"

如果我mode(test$numr),我会[1] "character"

我也可以test$numr[1]<-"fjfj"没有错误,数据存储在那个特定的地方。

如果我没有使用character(10)设置data.frame,我只需要像上一个例子中那样做数字,只需将字符串存储到列中的某个字符串,就可以将数字更改为字符即使它之前被定义为数字。 为什么R对待角色的方式与我在例子中的预期不同?

1 个答案:

答案 0 :(得分:2)

我对上面发布的结果有点怀疑。

>     test<-data.frame(char=character(10), numr=numeric(10))
> str(test)
'data.frame':   10 obs. of  2 variables:
 $ char: Factor w/ 1 level "": 1 1 1 1 1 1 1 1 1 1
 $ numr: num  0 0 0 0 0 0 0 0 0 0
> mode(test$char)
[1] "numeric"
> mode(test$numr)
[1] "numeric"

这告诉我char是一个因素,numr是数字,并且两者都存储为数字(因子具有将数字级代码映射到标签的附加属性)。您收到错误是因为您尝试在char中设置一个未包含在级别列表中的值(仅包含空字符串"")。正如@GSee在评论中所说,你可能想要stringsAsFactors=FALSE

> test<-data.frame(char=character(10), numr=numeric(10), 
                   stringsAsFactors=FALSE)
> str(test)
'data.frame':   10 obs. of  2 variables:
 $ char: chr  "" "" "" "" ...
 $ numr: num  0 0 0 0 0 0 0 0 0 0
> test$char[1] <- "ery" ## no error

您可以设置options(stringsAsFactors=FALSE)以使其成为全局默认行为。下次当你忘记全局设置此选项时,在自己的便利和混乱之间存在权衡,在StackOverflow上提出问题,并且让每个人都想知道为什么你会得到不同的答案......

最后,如上所述,如果char以数字开头,当您尝试将元素设置为字符值时,R会默默地将其强制转换为字符串。我认为这实际上是非常糟糕的设计,但它现在已经过深刻地融入了R的行为......

> test<-data.frame(char=numeric(10), numr=numeric(10))
> test$char[1] <- "ery"
> str(test)
'data.frame':   10 obs. of  2 variables:
 $ char: chr  "ery" "0" "0" "0" ...
 $ numr: num  0 0 0 0 0 0 0 0 0 0