R data.table包-使用:=运算符在列中添加值

R data.table包-使用:=运算符在列中添加值,r,dataframe,data.table,R,Dataframe,Data.table,问题 我有一个data.frame,希望根据其他列中的数据将数据放置在一列中 下面是我的data.frame(缩写版)的一个示例: 我想根据“施肥、播种、叶片库”列中的条件为新叶片库赋值。 例如: 如果施肥=“N0”、播种=“S1”和叶栅=“F2”,则新叶栅=“F3*” 如果受精率=“N0”,播种率=“S1”和叶片数=“F3”,则新叶片数=“F2*” 至于解决办法: 我可以让它与一堆for/if一起工作,但是它会很慢,而且不会 非常“R-ish”,也许即使我“应用”了它 据我所知,我可以对

问题

我有一个data.frame,希望根据其他列中的数据将数据放置在一列中

下面是我的data.frame(缩写版)的一个示例:

我想根据“施肥、播种、叶片库”列中的条件为新叶片库赋值。 例如:

  • 如果施肥=“N0”、播种=“S1”和叶栅=“F2”,则新叶栅=“F3*”
  • 如果受精率=“N0”,播种率=“S1”和叶片数=“F3”,则新叶片数=“F2*”
至于解决办法:

  • 我可以让它与一堆for/if一起工作,但是它会很慢,而且不会 非常“R-ish”,也许即使我“应用”了它
  • 据我所知,我可以对 {data.table}包。可能会好得多。事实上,它一直是 在其他地方讨论了堆栈溢出,但我找不到一种方法使这篇文章的解决方案起作用。我不明白为什么,即使当我看着你的时候。我遗漏了一些东西,也许是显而易见的,所以我想我可以问一下。对不起,重复了
我尝试过的一些解决方案:

library(data.table)
DT[Fertilization=="N0" & Sowing=="S1" & FoliarRank=="F2", New_FoliarRank:="F3*"] # seems to be same script as other post
DT[ , New_FoliarRank:= {Fertilization=="N0" & Sowing=="S1" & FoliarRank=="F2"; "F3*"}] # adapted from another post; doesn't work either
作为回报,它给了我:

Error in `:=`(New_FoliarRank, "F3*") : 
Check that is.data.table(DT) == TRUE. Otherwise, := and `:=`(...) are defined for use in j, once only and in particular ways. See help(":=").
建议的解决方案(另一个解决方案发布在下面)

您可以使用以下因素:

library(data.table)
setDT(DT)
DT[, New_FoliarRank := interaction(Fertilization, Sowing, FoliarRank)]
#check levels
levels(DT[, New_FoliarRank])

#assign new labels
DT[, New_FoliarRank := factor(New_FoliarRank, 
                              levels = levels(New_FoliarRank),
                              labels = c("012", "212", "022", "222", "013", "213", "023", "223"))]

#   Fertilization Sowing FoliarRank New_FoliarRank
#1:            N0     S1         F2            012
#2:            N0     S1         F3            013
#3:            N0     S2         F2            022
#4:            N0     S2         F3            023
#5:            N2     S1         F2            212
#6:            N2     S1         F3            213
#7:            N2     S2         F2            222
#8:            N2     S2         F3            223

@akrun:不,有两个以上的条件(实际上在完整的data.frame中有28个,我不能在线发布)。在脚本结束时,New_FoliarRank中不再有零(改为新值:F1*、F2*、F3*等)。在运行代码之前,不要创建
New_FoliarRank
,因为您将其设置为数字列并尝试添加字符值。另外,不要忘记将
DT
转换为data.table对象。如果不创建该列,只需按如下方式运行几行(每次使用不同的条件)
setDT(DT)[施肥==“N0”和播种==“S1”&FoliarRank==“F2”,新叶库:=“w”]
,一切都会正常fine@DavidArenburg嗯,他们应该初始化列。只给正确的班级。@Roland他们不必。但他们可以。我认为这主要取决于自己的喜好。例如,我从来没有这样做过。@everyone:谢谢你的时间。我使用as.data.table()更改了DT的类,并用“a”代替零初始化了New_FoliarRank,即New_FoliarRank=rep(“a”,length(受精))。成功了!@罗兰:谢谢,这也是一个很好的答案。我将在我的原始帖子中发布上面提出的解决方案,并将您的帖子标记为解决该主题的答案。
# Initial vectors (no need for New_FoliarRank)
Fertilization=c("N0","N0","N0","N0","N2","N2","N2","N2")
Sowing=c("S1","S1","S2","S2","S1","S1","S2","S2")
FoliarRank=c("F2","F3","F2","F3","F2","F3","F2","F3")

# Actually I was missing the class of DT (data.table instead of data.frame)
DT=data.table(Fertilization,Sowing,FoliarRank)

library(data.table)
# And I shouldn't have created New_FoliarRank (esp. in with numerical values), as it is created "on the spot"
setDT(DT)[Fertilization=="N0" & Sowing=="S1" & FoliarRank=="F2", New_FoliarRank := "F3*"]
setDT(DT)[Fertilization=="N0" & Sowing=="S1" & FoliarRank=="F3", New_FoliarRank := "F2*"]
library(data.table)
setDT(DT)
DT[, New_FoliarRank := interaction(Fertilization, Sowing, FoliarRank)]
#check levels
levels(DT[, New_FoliarRank])

#assign new labels
DT[, New_FoliarRank := factor(New_FoliarRank, 
                              levels = levels(New_FoliarRank),
                              labels = c("012", "212", "022", "222", "013", "213", "023", "223"))]

#   Fertilization Sowing FoliarRank New_FoliarRank
#1:            N0     S1         F2            012
#2:            N0     S1         F3            013
#3:            N0     S2         F2            022
#4:            N0     S2         F3            023
#5:            N2     S1         F2            212
#6:            N2     S1         F3            213
#7:            N2     S2         F2            222
#8:            N2     S2         F3            223