表达以下决策规则的最短方法是什么
df<-data.frame(a=LETTERS[1:5],b=1:5)
index<-df[,"a"]=="F"
if(any(index)){
df$new<-"A"
}else{
df$new<-"B"
}
表达以下决策规则的最短方法是什么
df<-data.frame(a=LETTERS[1:5],b=1:5)
index<-df[,"a"]=="F"
if(any(index)){
df$new<-"A"
}else{
df$new<-"B"
}
最短的是
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
(这不是您的代码当前正在执行的操作。)
也许使用矢量化版本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
另一个解决方案ifelse
:
df$new <- ifelse("F" %in% df$a,"A","B")
从技术上讲,这比上述所有内容都短;)
df$new <- LETTERS(2-any("F"%in%df$a))