2

我遇到了 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"没有错误,并且数据存储在那个特定的地方。

如果我不使用设置 data.frame 而不是将character(10)所有内容都设置为数字,那么就像前面的示例一样,它将允许我将数字更改为字符,只需将字符串存储到列中的某个内容,即使它以前被定义为数字. 为什么 R 对待字符的方式与我在示例中所期望的不同?

4

1 回答 1

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
于 2012-12-05T20:04:21.337 回答