根据dplyr分组修改列值。

huangapple go评论98阅读模式
英文:

Modify column values based on group dplyr

问题

我想要修改当ID=3,var1=c和var2=0时的var3,使其增加+5。

期望输出:

  1. ID var1 var2 var3
  2. 1 1 a 1 21
  3. 2 2 b 1 50
  4. 3 3 c 1 40
  5. 4 3 c 0 35
  6. 5 4 d 1 29
  7. 6 5 e 1 45
  8. 7 5 f 0 33
  9. 8 7 g 0 51
  10. 9 7 h 1 70
  11. 10 8 h 0 46
英文:

I have a dataframe:

  1. df <- data.frame(ID = c(1, 2, 3, 3, 4, 5, 5, 7, 7, 8),
  2. var1 = c('a', 'b', 'c', 'c', 'd', 'e', 'f', 'g', 'h', 'h'),
  3. var2 = c(1, 1, 1, 0, 1, 1, 0, 0, 1, 0),
  4. var3 = c(21, 50, 40, 30, 29, 45, 33, 51, 70, 46))

I want to modify var3 when ID=3, var1=c and var2 is 0, so that the value increases by +5

Input:

  1. ID var1 var2 var3
  2. 1 1 a 1 21
  3. 2 2 b 1 50
  4. 3 3 c 1 40
  5. 4 3 c 0 30
  6. 5 4 d 1 29
  7. 6 5 e 1 45
  8. 7 5 f 0 33
  9. 8 7 g 0 51
  10. 9 7 h 1 70
  11. 10 8 h 0 46

Desired output:

  1. ID var1 var2 var3
  2. 1 1 a 1 21
  3. 2 2 b 1 50
  4. 3 3 c 1 40
  5. 4 3 c 0 35
  6. 5 4 d 1 29
  7. 6 5 e 1 45
  8. 7 5 f 0 33
  9. 8 7 g 0 51
  10. 9 7 h 1 70
  11. 10 8 h 0 46

答案1

得分: 2

你可以使用 case_when 来设置多个条件,根据条件来将列中的值增加5或保持原始值,示例如下:

  1. library(dplyr)
  2. df %>%
  3. mutate(var3 = case_when(ID == 3 & var1 == "c" & var2 == 0 ~ var3 + 5,
  4. TRUE ~ var3))
  5. #> ID var1 var2 var3
  6. #> 1 1 a 1 21
  7. #> 2 2 b 1 50
  8. #> 3 3 c 1 40
  9. #> 4 3 c 0 35
  10. #> 5 4 d 1 29
  11. #> 6 5 e 1 45
  12. #> 7 5 f 0 33
  13. #> 8 7 g 0 51
  14. #> 9 7 h 1 70
  15. #> 10 8 h 0 46

创建于2023-02-13,使用 reprex v2.0.2

英文:

You could use case_when to set multiple conditions and add 5 to the column or keep the same value like this:

  1. library(dplyr)
  2. df %>%
  3. mutate(var3 = case_when(ID == 3 & var1 == "c" & var2 == 0 ~ var3 + 5,
  4. TRUE ~ var3))
  5. #> ID var1 var2 var3
  6. #> 1 1 a 1 21
  7. #> 2 2 b 1 50
  8. #> 3 3 c 1 40
  9. #> 4 3 c 0 35
  10. #> 5 4 d 1 29
  11. #> 6 5 e 1 45
  12. #> 7 5 f 0 33
  13. #> 8 7 g 0 51
  14. #> 9 7 h 1 70
  15. #> 10 8 h 0 46

<sup>Created on 2023-02-13 with reprex v2.0.2</sup>

答案2

得分: 1

base R中,我们创建一个逻辑表达式并更新:

  1. i1 <- with(df, ID == 3 & var1 == "c" & var2 == 0)
  2. df$var3[i1] <- df$var3[i1] + 5

输出:

  1. > df
  2. ID var1 var2 var3
  3. 1 1 a 1 21
  4. 2 2 b 1 50
  5. 3 3 c 1 40
  6. 4 3 c 0 35
  7. 5 4 d 1 29
  8. 6 5 e 1 45
  9. 7 5 f 0 33
  10. 8 7 g 0 51
  11. 9 7 h 1 70
  12. 10 8 h 0 46
英文:

In base R, we create a logical expression and update

  1. i1 &lt;- with(df, ID ==3 &amp; var1 == &quot;c&quot; &amp; var2 == 0 )
  2. df$var3[i1] &lt;- df$var3[i1] + 5

-output

  1. &gt; df
  2. ID var1 var2 var3
  3. 1 1 a 1 21
  4. 2 2 b 1 50
  5. 3 3 c 1 40
  6. 4 3 c 0 35
  7. 5 4 d 1 29
  8. 6 5 e 1 45
  9. 7 5 f 0 33
  10. 8 7 g 0 51
  11. 9 7 h 1 70
  12. 10 8 h 0 46

答案3

得分: 0

使用data.tableifelse的替代方法如下:

  1. library(data.table)
  2. setDT(df)
  3. df[, var3 := ifelse(ID == 3 & var1 == "c" & var2 == 0, var3 + 5, var3)]
  4. df
  5. ID var1 var2 var3
  6. 1: 1 a 1 21
  7. 2: 2 b 1 50
  8. 3: 3 c 1 40
  9. 4: 3 c 0 35
  10. 5: 4 d 1 29
  11. 6: 5 e 1 45
  12. 7: 5 f 0 33
  13. 8: 7 g 0 51
  14. 9: 7 h 1 70
  15. 10: 8 h 0 46

这是使用data.tableifelse函数进行条件操作的示例。

英文:

Alternatively, using data.table and ifelse

  1. library(data.table)
  2. setDT(df)
  3. df[, var3 := ifelse(ID == 3 &amp; var1==&quot;c&quot; &amp; var2 == 0, var3 + 5, var3), ]
  4. df
  5. ID var1 var2 var3
  6. 1: 1 a 1 21
  7. 2: 2 b 1 50
  8. 3: 3 c 1 40
  9. 4: 3 c 0 35
  10. 5: 4 d 1 29
  11. 6: 5 e 1 45
  12. 7: 5 f 0 33
  13. 8: 7 g 0 51
  14. 9: 7 h 1 70
  15. 10: 8 h 0 46

huangapple
  • 本文由 发表于 2023年2月14日 01:43:07
  • 转载请务必保留本文链接:https://go.coder-hub.com/75439445.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定