英文:
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
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论