我遇到了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对待角色的方式与我在例子中的预期不同?
答案 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