例如,我有以下数据框。我想要做的是在该数据框中添加另一列(第7列)。
条件是if Sepal.Length >=5 assign "UP" else assign "DOWN"
。
我们将该栏目称为“规则”。
> iris
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
6 5.4 3.9 1.7 0.4 setosa
7 4.6 3.4 1.4 0.3 setosa
8 5.0 3.4 1.5 0.2 setosa
9 4.4 2.9 1.4 0.2 setosa
10 4.9 3.1 1.5 0.1 setosa
...
这样做的方法是什么?
答案 0 :(得分:43)
尝试
iris$Regulation <- ifelse(iris$Sepal.Length >=5, "UP", "DOWN")
答案 1 :(得分:2)
为了更新可能的规范,包dplyr
具有功能mutate
,可让您以向量化方式在data.frame中创建新列:
library(dplyr)
iris_new <- iris %>%
mutate(Regulation = if_else(Sepal.Length >= 5, 'UP', 'DOWN'))
这将创建一个名为Regulation
的新列,该列基于将条件应用于'UP'
列而由'DOWN'
或Sepal.Length
组成。
case_when
函数(同样来自dplyr
)提供了一种易于阅读的方式来将多个条件链接在一起:
iris %>%
mutate(Regulation = case_when(Sepal.Length >= 5 ~ 'High',
Sepal.Length >= 4.5 ~ 'Mid',
TRUE ~ 'Low'))
这与if_else
一样工作,除了不是1个条件,其返回值为TRUE和FALSE,每行都有条件(~
的左侧)和一个返回值({{的右侧) 1}}),则返回TRUE。如果为false,则继续进行下一个条件。
在这种情况下,~
将返回Sepal.Length >= 5
的行,'High'
(因为第一个条件必须失败)和Sepal.Length < 5
的行将返回{{1} },所有其他行将返回Sepal.Length >= 4.5
。由于'Mid'
始终为'Low'
,因此它用于提供默认值。
答案 2 :(得分:2)
没有 ifelse :
# Install the necessary package
library(sqldf)
sqldf('SELECT Year, df1.ID, Coeff
FROM df1 JOIN df2
ON df1.ID = df2.ID')
基准测试,比 ifelse 快14倍:
iris$Regulation <- c("DOWN", "UP")[ (iris$Sepal.Length >= 5) + 1 ]