SO / R的新手,所以提前感谢您对我的耐心。我试图在R中使用一个简单的if / else语句来创建一个列,并根据不同列的值填充三个类别的高/中/低。
我得到的错误是多个参数只能是“第一个”,“最后一个”#39;或者'所有'。我发现这个错误的文档很少,我知道我的问题可能很简单。
再次重申我对此非常陌生。预先感谢您的帮助。一种更有效的方法也是我非常愿意听到的。
zips3[, PW_Data := ifelse(pctr08zip_updated > 0.4 & pctr08zip_updated <=0.5), "Poop",
ifelse(pctr08zip_updated > 0.5 & pctr08zip_updated <=0.6), "Poop2",
ifelse(pctr08zip_updated > 0.6 & pctr08zip_updated <=0.7), "South", "Exclude"]
答案 0 :(得分:2)
这个问题与ifelse无关,而且与你的(和)正确匹配无关,这意味着你将额外的参数传递给data.table。语法为ifelse(condition, trueresult, falseresult)
,如ifelse(1:3 < 3, TRUE, FALSE)
,而非ifelse(1:3 < 3), TRUE, FALSE)
,就像你一样,根本不会正常工作。例如,匹配括号使其工作正常:
library(data.table)
zips3 <- data.table(pctr08zip_updated=seq(0L,10L,1L)/10)
zips3[,
PW_Data :=
ifelse(pctr08zip_updated > 0.4 & pctr08zip_updated <=0.5, "Poop",
ifelse(pctr08zip_updated > 0.5 & pctr08zip_updated <=0.6, "Poop2",
ifelse(pctr08zip_updated > 0.6 & pctr08zip_updated <=0.7, "South",
"Exclude")))
]
Re:一种更有效的方法,请参见?cut
,它会将矢量切割成由一系列切割点定义的线段,并返回一个因子变量,该变量可以适当标记。
labs <- c("Exclude","Poop","Poop2","South","Exclude")
zips3[, PW_Data_cut := labs[cut(pctr08zip_updated, c(-Inf,0.4,0.5,0.6,0.7,Inf))] ]
我在这里单独指定标签,因为您的高值和低值的重复输出超出范围。它给出了相同的结果:
identical(zips3$PW_Data, zips3$PW_Data_cut)
#[1] TRUE