如何使用dplyr将矢量添加为列(示例)?

时间:2017-12-24 10:40:28

标签: r dplyr

我有一些数据。我想添加一列,但不是常规方式。

data <- data.frame(month_num = 1:12, month_name = month.abb)
data

       month_num month_name
1          1        Jan
2          2        Feb
3          3        Mar
4          4        Apr
5          5        May
6          6        Jun
7          7        Jul
8          8        Aug
9          9        Sep
10        10        Oct
11        11        Nov
12        12        Dec

现在,我想为此数据添加第三列。例如,我想将以下向量作为data中的列:

sentiment = c(rep("cold", 3), rep("hot", 6), rep("cold", 3)

我通常会做的(在baseR中)是以下之一:

  1. 使用$

    添加
    data$sentiment <- sentiment
    
  2. 通过列索引创建添加

    data[,3] <- sentiment
    
  3. 在初始创建中添加

    data.frame(month_num = 1:12, month_name = month.abb, sentiment = sentiment)
    
  4. 是的,data.table在其引用语义中也做得很好。

    data <- data.table(month_num = 1:12, month_name = month.abb)
    
    data[,`:=`(sentiment = sentiment)]
    
    data
    
        month_num month_name sentiment
     1:         1        Jan      cold
     2:         2        Feb      cold
     3:         3        Mar      cold
     4:         4        Apr       hot
     5:         5        May       hot
     6:         6        Jun       hot
     7:         7        Jul       hot
     8:         8        Aug       hot
     9:         9        Sep       hot
    10:        10        Oct      cold
    11:        11        Nov      cold
    12:        12        Dec      cold
    

    但是,我不想以这种方式添加它。我想使用dplyr相关函数来完成这项任务。 dplyr中是否有任何函数可以让我执行列创建任务?

    注意: mutate()无效! (或者我现在知道的。)

    data%>%
    mutate(sentiment = sentiment)
    
       month_num month_name   V3 sentiment
    1          1        Jan cold      cold
    2          2        Feb cold      cold
    3          3        Mar cold      cold
    4          4        Apr  hot       hot
    5          5        May  hot       hot
    6          6        Jun  hot       hot
    7          7        Jul  hot       hot
    8          8        Aug  hot       hot
    9          9        Sep  hot       hot
    10        10        Oct cold      cold
    11        11        Nov cold      cold
    12        12        Dec cold      cold
    

    正如您所看到的那样,该列是重复的,我不确定为什么会发生这种情况。也许它与sentiment中唯一值的数量有关?

    总而言之,有没有办法在dplyr中使用mutate()或其他相关功能来实现这一目标?

1 个答案:

答案 0 :(得分:1)

我所知道的最简单的方法是使用函数case_when

data <- data.frame(month_num = 1:12, month_name = month.abb)
data
sentiment = c(rep("cold", 3), rep("hot", 6), rep("cold", 3)

data <- data %>% 
    mutate(sentiment=case_when(
        month_num<=3 | month_num>=10 ~ "cold",
        month_num>=4 & month_num<=9 ~ "hot"
    ))