根据组属性在R中生成新变量

时间:2016-06-21 09:06:12

标签: r dataframe

我需要在R中生成一个名为Result的新变量,例如:

基于Variable.ID 如果所有Classification per Variable.ID等于“是”,则结果=“是” 和 如果所有Classification per Variable.ID等于“no”,则Result =“no” 其他 结果= “未确定的”

enter image description here

任何人都可以告诉我该怎么做? (有数百个Variable.ID,所以请不要进行手动矢量分配。)

3 个答案:

答案 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,并检查所有值为yesno

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])
}