【问题标题】:Mutate the values of a specific group in your data with dplyr in R使用 R 中的 dplyr 改变数据中特定组的值
【发布时间】:2021-01-30 23:32:17
【问题描述】:

我的数据框是这样的

value <- c(0,0.1,0.2,0.4,0,0.05,0.05,0.5,0.20,0.40,0.50,0.60)
time <- c(1,1,1,1,2,2,2,2,3,3,3,3)
ID <- c(1,2,3,4,1,2,3,4,1,2,3,4)

test <- data.frame(value, time, ID)
test

   value time ID
1   0.00    1  1
2   0.10    1  2
3   0.20    1  3
4   0.40    1  4
5   0.00    2  1
6   0.05    2  2
7   0.05    2  3
8   0.50    2  4
9   0.20    3  1
10  0.40    3  2
11  0.50    3  3
12  0.60    3  4

在这个例子中,我会用 1 减去 time==2 的值,我的数据看起来像这样 像mutate(time[time==2]= time[time==2] -1) 这样的东西当然是不可能的

   value time ID
1   0.00    1  1
2   0.10    1  2
3   0.20    1  3
4   0.40    1  4
5   0.00    1  1
6   0.05    1  2
7   0.05    1  3
8   0.50    1  4
9   0.20    3  1
10  0.40    3  2
11  0.50    3  3
12  0.60    3  4

非常感谢任何提示和帮助

编辑

一种方法是替换该值,但如何减去它? mutate(time=replace(time, time==2, 1))

【问题讨论】:

  • 你能解释一下你的输出吗?你说I would subtract the values of time==2 with 1为什么第一个4值是0,而time == 0
  • 你好 Ronak 你是对的,我的输出有错误。我纠正了它。谢谢你的回答

标签: r dplyr tidyverse tidy


【解决方案1】:

time == 2 时将时间值减 1,您可以这样做:

library(dplyr)

test %>% mutate(time= time - as.integer(time == 2))

#   value time ID
#1   0.00    1  1
#2   0.10    1  2
#3   0.20    1  3
#4   0.40    1  4
#5   0.00    1  1
#6   0.05    1  2
#7   0.05    1  3
#8   0.50    1  4
#9   0.20    3  1
#10  0.40    3  2
#11  0.50    3  3
#12  0.60    3  4

【讨论】:

    【解决方案2】:

    您可以使用case_when() 来执行此操作。下面的代码将在time 等于2 时将time 替换为1,否则返回time 的值。请注意,这看起来与您想要的输出不完全一样,因为这会生成 1 和 3 而不是 0 和 1。

    library(dplyr)
    test <- test %>% 
      mutate(time = case_when(
        time == 2 ~ 1, 
        TRUE ~ time
      ))
    test
    #    value time ID
    # 1   0.00    1  1
    # 2   0.10    1  2
    # 3   0.20    1  3
    # 4   0.40    1  4
    # 5   0.00    1  1
    # 6   0.05    1  2
    # 7   0.05    1  3
    # 8   0.50    1  4
    # 9   0.20    3  1
    # 10  0.40    3  2
    # 11  0.50    3  3
    # 12  0.60    3  4
    

    要生成与上述所需输出完全相同的内容,您需要:

    test <- test %>% 
      mutate(time = case_when(
        time == 1 ~ 0, 
        TRUE ~ 1
      ))
    test
    #    value time ID
    # 1   0.00    0  1
    # 2   0.10    0  2
    # 3   0.20    0  3
    # 4   0.40    0  4
    # 5   0.00    0  1
    # 6   0.05    0  2
    # 7   0.05    0  3
    # 8   0.50    0  4
    # 9   0.20    1  1
    # 10  0.40    1  2
    # 11  0.50    1  3
    # 12  0.60    1  4
    

    【讨论】:

      猜你喜欢
      • 2016-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-10
      • 2019-03-06
      • 1970-01-01
      • 2021-12-19
      • 1970-01-01
      相关资源
      最近更新 更多