7

表达以下决策规则的最短方法是什么

df<-data.frame(a=LETTERS[1:5],b=1:5)
index<-df[,"a"]=="F"
if(any(index)){
  df$new<-"A"
}else{
  df$new<-"B"
}
4

4 回答 4

12

最短的是

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")

仅根据该行中的值将 aA或 aB放在每一行上a(这不是您的代码当前正在执行的操作。)

于 2013-08-23T11:11:17.957 回答
4

也许使用矢量化版本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
于 2013-08-23T10:41:30.597 回答
1

另一个解决方案ifelse

df$new <- ifelse("F" %in% df$a,"A","B") 
于 2013-08-23T14:22:32.113 回答
0

从技术上讲,这比上述所有内容都短;)

df$new <- LETTERS(2-any("F"%in%df$a))
于 2013-08-23T14:24:36.507 回答