我需要在R中生成一个名为Result的新变量,例如:
基于Variable.ID 如果所有Classification per Variable.ID等于“是”,则结果=“是” 和 如果所有Classification per Variable.ID等于“no”,则Result =“no” 其他 结果= “未确定的”
任何人都可以告诉我该怎么做? (有数百个Variable.ID,所以请不要进行手动矢量分配。)
答案 0 :(得分:3)
这可以用ave(),any(),all()等来完成。但问题不适合交叉验证。以下是适合您的启动器。您必须将“NA”更改为“undeterminded”,但我尽量使代码尽可能容易掌握:
d <- data.frame(v.id=c(1,1,1,2,2,2,3,3,3),
clas=c("yes", "yes", "yes", "yes", "yes",
"no","no","no", "no"))
d$result <- ave(d$clas, d$v.id,
FUN=function(x) {
if(all(x=="yes")){ return("yes") }
if(all(x=="no")) { return("no") }
else return(NA)
})
答案 1 :(得分:3)
您可以按Classification
拆分Variable.ID
,并检查所有值为yes
或no
:
library(plyr)
results <- llply(split(d, d$Variable.ID), function(d2) {
if(all(d2$Classification=='yes')) {
'yes'
} else if(all(d2$Classification=='no')) {
'no'
} else {
'undetermined'
}
})
d$Results <- factor(unlist(results[d$Variable.ID]))
......应该能满足你的要求:
> print(d)
Variable.ID Classification Results
1 1 yes yes
2 1 yes yes
3 1 yes yes
4 1 yes yes
5 1 yes yes
6 2 no no
7 2 no no
8 2 no no
9 2 no no
10 3 yes undetermined
11 3 no undetermined
12 4 both undetermined
13 4 <NA> undetermined
14 4 yes undetermined
答案 2 :(得分:0)
foo <- function(x) {
if (sum(x == "yes") == length(x)) {
return("yes")
} else if (sum(x == "no") == length(x)) {
return("no")
} else {
return("undetermined")
}
}
for (i in seq_along(data) {
data$Result[i] <- foo(data$Classification[data$Variable.ID == data$Variable.ID[i])
}