根据dplyr分组修改列值。

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

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 &lt;- with(df, ID ==3  &amp; var1 == &quot;c&quot; &amp; var2 == 0 )
df$var3[i1] &lt;- df$var3[i1] + 5

-output

&gt; 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.tableifelse的替代方法如下:

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.tableifelse函数进行条件操作的示例。

英文:

Alternatively, using data.table and ifelse

library(data.table)

setDT(df)

df[, var3 := ifelse(ID == 3 &amp; var1==&quot;c&quot; &amp; 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

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:

确定