表达以下决策规则的最短方式是什么
df<-data.frame(a=LETTERS[1:5],b=1:5)
index<-df[,"a"]=="F"
if(any(index)){
df$new<-"A"
}else{
df$new<-"B"
}
答案 0 :(得分:9)
最短是
df$new=c("B","A")[1+any(df$a=="F")]
更优雅的是:
df$new <- if (any(df$a == "F")) "A" else "B"
或
df <- transform(df, new = if (any(a == "F")) "A" else "B")
ifelse
运算符被建议两次,但我会保留它用于不同类型的操作:
df$new <- ifelse(df$a == "F", "A", "B")
会在每一行上放置A
或B
,具体取决于该行中a
的值(这不是您的代码当前正在执行的操作。)
答案 1 :(得分:3)
可能使用矢量化版本ifelse
> df$new <- ifelse(any(df[,"a"]=="F"), "A", "B")
> df
a b new
1 A 1 B
2 B 2 B
3 C 3 B
4 D 4 B
5 E 5 B
答案 2 :(得分:1)
ifelse
的另一种解决方案:
df$new <- ifelse("F" %in% df$a,"A","B")
答案 3 :(得分:0)
从技术上讲,这比上述所有内容都短;)
df$new <- LETTERS(2-any("F"%in%df$a))