英文:
Modify column values based on group dplyr
问题
我想要修改当ID=3,var1=c和var2=0时的var3,使其增加+5。
期望输出:
ID var1 var2 var3
1 1 a 1 21
2 2 b 1 50
3 3 c 1 40
4 3 c 0 35
5 4 d 1 29
6 5 e 1 45
7 5 f 0 33
8 7 g 0 51
9 7 h 1 70
10 8 h 0 46
英文:
I have a dataframe:
df <- data.frame(ID = c(1, 2, 3, 3, 4, 5, 5, 7, 7, 8),
var1 = c('a', 'b', 'c', 'c', 'd', 'e', 'f', 'g', 'h', 'h'),
var2 = c(1, 1, 1, 0, 1, 1, 0, 0, 1, 0),
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:
ID var1 var2 var3
1 1 a 1 21
2 2 b 1 50
3 3 c 1 40
4 3 c 0 30
5 4 d 1 29
6 5 e 1 45
7 5 f 0 33
8 7 g 0 51
9 7 h 1 70
10 8 h 0 46
Desired output:
ID var1 var2 var3
1 1 a 1 21
2 2 b 1 50
3 3 c 1 40
4 3 c 0 35
5 4 d 1 29
6 5 e 1 45
7 5 f 0 33
8 7 g 0 51
9 7 h 1 70
10 8 h 0 46
答案1
得分: 2
你可以使用 case_when
来设置多个条件,根据条件来将列中的值增加5或保持原始值,示例如下:
library(dplyr)
df %>%
mutate(var3 = case_when(ID == 3 & var1 == "c" & var2 == 0 ~ var3 + 5,
TRUE ~ var3))
#> ID var1 var2 var3
#> 1 1 a 1 21
#> 2 2 b 1 50
#> 3 3 c 1 40
#> 4 3 c 0 35
#> 5 4 d 1 29
#> 6 5 e 1 45
#> 7 5 f 0 33
#> 8 7 g 0 51
#> 9 7 h 1 70
#> 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:
library(dplyr)
df %>%
mutate(var3 = case_when(ID == 3 & var1 == "c" & var2 == 0 ~ var3 + 5,
TRUE ~ var3))
#> ID var1 var2 var3
#> 1 1 a 1 21
#> 2 2 b 1 50
#> 3 3 c 1 40
#> 4 3 c 0 35
#> 5 4 d 1 29
#> 6 5 e 1 45
#> 7 5 f 0 33
#> 8 7 g 0 51
#> 9 7 h 1 70
#> 10 8 h 0 46
<sup>Created on 2023-02-13 with reprex v2.0.2</sup>
答案2
得分: 1
在base R
中,我们创建一个逻辑表达式并更新:
i1 <- with(df, ID == 3 & var1 == "c" & var2 == 0)
df$var3[i1] <- df$var3[i1] + 5
输出:
> df
ID var1 var2 var3
1 1 a 1 21
2 2 b 1 50
3 3 c 1 40
4 3 c 0 35
5 4 d 1 29
6 5 e 1 45
7 5 f 0 33
8 7 g 0 51
9 7 h 1 70
10 8 h 0 46
英文:
In base R
, we create a logical expression and update
i1 <- with(df, ID ==3 & var1 == "c" & var2 == 0 )
df$var3[i1] <- df$var3[i1] + 5
-output
> df
ID var1 var2 var3
1 1 a 1 21
2 2 b 1 50
3 3 c 1 40
4 3 c 0 35
5 4 d 1 29
6 5 e 1 45
7 5 f 0 33
8 7 g 0 51
9 7 h 1 70
10 8 h 0 46
答案3
得分: 0
使用data.table
和ifelse
的替代方法如下:
library(data.table)
setDT(df)
df[, var3 := ifelse(ID == 3 & var1 == "c" & var2 == 0, var3 + 5, var3)]
df
ID var1 var2 var3
1: 1 a 1 21
2: 2 b 1 50
3: 3 c 1 40
4: 3 c 0 35
5: 4 d 1 29
6: 5 e 1 45
7: 5 f 0 33
8: 7 g 0 51
9: 7 h 1 70
10: 8 h 0 46
这是使用data.table
和ifelse
函数进行条件操作的示例。
英文:
Alternatively, using data.table
and ifelse
library(data.table)
setDT(df)
df[, var3 := ifelse(ID == 3 & var1=="c" & var2 == 0, var3 + 5, var3), ]
df
ID var1 var2 var3
1: 1 a 1 21
2: 2 b 1 50
3: 3 c 1 40
4: 3 c 0 35
5: 4 d 1 29
6: 5 e 1 45
7: 5 f 0 33
8: 7 g 0 51
9: 7 h 1 70
10: 8 h 0 46
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论