【问题标题】:Why can't I edit values in this data frame?为什么我不能编辑此数据框中的值?
【发布时间】:2014-06-06 21:54:26
【问题描述】:

我有一个中等大小的数据框,里面有两行被破坏的行。地址不好,所以geocode() 没有对它们进行地理编码,所以我也没有纬度/经度信息。

我尝试制作一个临时框架来玩:

tmp.frame <- subset(all.sites, is.na(all.sites$lat))

我可以用tmp.frame$Address &lt;- c("Better Address 1","Better Addresss 2") 更新tmp.frame 中的值,但我似乎无法编辑较大框架中的值。 all.sites[392, 7] 是缺少纬度/经度的地方之一,我 thought 认为 all.sites[392, 7] = c("Better Addy") 可以解决问题,但我得到了这个:

Warning message:
In `[<-.factor`(`*tmp*`, iseq, value = "Better Addy") :
  invalid factor level, NA generated

奇怪的是,tmp.frame[2,4] = c("Better") 工作得很好。所以我不确定两者之间的区别是什么。

注意:当我尝试vi(all.sites[392,7]) 时,我大概明白了:

structure(NA_integer_, .Label = c("10003 39th Avenue",..., class = "factor")

【问题讨论】:

  • 我认为问题可能在于您的某些列被转换为因子,而不是数字或字符。如果是这种情况,这可能是相关的:stackoverflow.com/questions/2851015/…
  • 是的,您正在尝试将字符类值放入可能是因子类列的位置。也许tmp.frame$Address &lt;- as.factor(c("Better Address 1","Better Addresss 2")) 会起作用
  • @Csislander 听起来不错。谢谢。

标签: r


【解决方案1】:

发生这种情况是因为您尝试更新的列是 factor,根据定义,它具有有限域(可能值的集合)。当您尝试将条目强制为不属于此域的级别时,会产生警告和NA。试试这个:

ff <- factor(sample(1:3, size=20, replace=TRUE))  ## factor of 1, 2, and 3
ff[5] <- 4    ## try changing the fifth entry to an 'unknown' value
levels(ff)    ## show set of known values

如果您希望能够将值修改为您喜欢的任何值,您需要将因子转换为characterinteger(取决于它所代表的内容)。只有在您确信所有可能的值都存在之后才更改为一个因子。您也可以手动指定它们:

ff2 <- factor(sample(1:3, size=20, replace=TRUE), levels=1:4)  ## 1-4 are legal
ff2[5] <- 4    ## accepted without problems
head(ff2)      ## check 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-18
    • 1970-01-01
    • 2018-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多