【问题标题】:Warning messages: 1: Unknown or uninitialised column in R警告消息:1:R 中的未知或未初始化列
【发布时间】:2020-07-09 07:51:26
【问题描述】:

我有一个这样的

AID=c("9671608","9671618","9677162")
dep=c(23,45,12)
t8=c(1,0,2)
a1_sum=c(2,10,1)

dataall=data.frame(AID,dep,t8,a1_sum)
    > dataall
      AID dep t8 a1_sum
1 9671608  23  1      2
2 9671618  45  0      10
3 9677162  12  2      1

我修改了第二行a1_sum的值如下,

dataall$a1_sum[dataall$AID=="9671618"]=1

我成功地做到了,但我收到以下警告消息,即使有时我运行与此数据相关的一些其他不同代码,如下所示:

警告信息: 1:未知或未初始化的列:'a1_sum'。

这可能是什么原因?

谢谢。

【问题讨论】:

  • al_suma1_sum 不同。检查您的代码,看看您在哪里输入了小写字母 l 而不是数字 1
  • @r2evans - 这段代码的棘手之处之一是dataall$AID=="9671618" 用于对向量进行子集化,dataall$a1_sum[],而不是数据框。
  • 废话,你说得对……阅读不完整。 (它看起来仍然是一个由拼写错误引起的问题。)
  • @LenGreski 感谢您的评论。这段代码实际上是我为演示我的实际问题而开发的可重现代码。似乎没有你提到的错字。另外我认为这个问题可能是由于我对数据进行子集化的方式。除了我的方法之外,还有更有效的方法吗?
  • 在做dataall$a1_sum[dataall$AID=="9671618"]=1之前你真的设置了a1_sum这个列吗?这有时会导致问题check this link. Appart 我看不出你的代码有什么问题。

标签: dataframe r dataframe data-manipulation


【解决方案1】:

我建议如下:

编辑:正如@r2evans,正确地指出当只有一个条件时最好使用if_else 而不是case_when

library(dplyr)
dataall <- dataall %>% dplyr::mutate(a1_sum = dplyr::if_else(AID == "9671618", 1, a1_sum)

data.table解决方案:

library(data.table)
dataall <- data.table::setDT(dataall)
dataall[AID =="9671618", a1_sum :=  1]

【讨论】:

  • 当只有一个条件时,我强烈推荐if_else 而不是case_when,因为它应该更快。我认为case_when 会在测试数量增加时胜出,类似于多个嵌套的if_else 调用。
猜你喜欢
  • 1970-01-01
  • 2018-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-24
相关资源
最近更新 更多