【问题标题】:adding a new column based upon values in another column using dplyr使用 dplyr 根据另一列中的值添加新列
【发布时间】:2021-10-13 01:09:28
【问题描述】:

我有一列数据框df$c_touch

c_touch
0
1
3
2
3
4
5

其中每个数字表示持续时间,例如0 = 2 mins, 1 = 5 mins, 2 = 10 mins, 3=15 mins, 4=20 mins, 5=30 mins

我想添加另一列df$c_duration 来表示喜欢

c_touch c_duration
0 2
1 5
3 15
2 10
3 15
4 20
5 30

到目前为止,我一直在使用循环,这有点难看/凌乱,我宁愿不使用它。是否有一种无循环的方式来添加额外的列,特别是使用 dplyr mutate 函数(因为我正在尝试使用 dplyr 重写我的所有代码)?

【问题讨论】:

  • 持续时间有规律吗?或者是c_touch的程度。即 5 之后是否有额外的持续时间?
  • 是的。只需merge 您的data.frame 和一个将c_touch 映射到c_duration 的查找data.frame。您可以使用 base R 或 dplyr 或 data.table 或 ...
  • 只需创建一个命名的参考向量并匹配,例如x <- setNames(c(2, 5, 10, 15, 20, 30), 0:5) ; x[match(df$c_touch, names(x))]。另外,我建议您在转换代码 dplyr 之前学习 R,因为您的代码包含循环,因为基础知识很幸运

标签: r dplyr


【解决方案1】:
library(dplyr)

df %>%
  mutate(c_duration = case_when(
    c_touch == 0 ~ 2,
    c_touch == 5 ~ 30,
    TRUE ~ c_touch * 5)
  )

【讨论】:

    【解决方案2】:

    这是dplyr 解决方案:

    # data.frame containing the mapping
    map <- data.frame(
        idx = 0:5,
        val = c(2, 5, 10, 15, 20, 30))
    
    # Sample data   
    df <- read.table(text =
        "c_touch
    0
    1
    3
    2
    3
    4
    5", header = T)
    
    dplyr::left_join(df, map, by = c("c_touch" = "idx"))
    #  c_touch val
    #1       0   2
    #2       1   5
    #3       3  15
    #4       2  10
    #5       3  15
    #6       4  20
    #7       5  30
    

    【讨论】:

      【解决方案3】:

      你可以在 mutate 中使用 dplyr::case_when:

      df <- df %>%
          mutate(c_duration = case_when(c_touch == 0 ~ 2,
              c_touch == 1 ~ 5,
              c_touch == 2 ~ 10,
              c_touch == 3 ~ 15,
              c_touch == 4 ~ 20,
              c_touch == 5 ~ 30))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-15
        • 2021-03-23
        • 2020-08-07
        相关资源
        最近更新 更多