如何根据条件将列添加到数据框中?

时间:2013-02-22 04:14:29

标签: r dataframe

例如,我有以下数据框。我想要做的是在该数据框中添加另一列(第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
    ...

这样做的方法是什么?

3 个答案:

答案 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 ]