使用dplyr基于另一列中的值添加新列

时间:2018-04-24 12:12:50

标签: r dplyr

我有一个数据框列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重写我的所有代码)?

3 个答案:

答案 0 :(得分:1)

以下是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

答案 1 :(得分:0)

你可以在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))

答案 2 :(得分:0)

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