首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为每行增加变量的值

如何为每行增加变量的值
EN

Stack Overflow用户
提问于 2021-07-01 15:59:50
回答 4查看 182关注 0票数 0

我有这个数据,

代码语言:javascript
复制
dat= rep(c("A", "B", "C"),3)
tat=c(rep("ttt", 6), rep("aaa", 6), rep("ddd", 6))
pct=c(14,7,12,8,11,13,19,6,9,11,13,20,11,18,6,9,10,13)
data=data.frame(dat, tat, pct) %>% group_by(tat) %>% mutate(max= max(pct))

> data
# A tibble: 18 x 4
# Groups:   tat [3]
   dat   tat     pct   max
   <chr> <chr> <dbl> <dbl>
 1 A     ttt      14    14
 2 B     ttt       7    14
 3 C     ttt      12    14
 4 A     ttt       8    14
 5 B     ttt      11    14
 6 C     ttt      13    14
 7 A     aaa      19    20
 8 B     aaa       6    20
 9 C     aaa       9    20
10 A     aaa      11    20
11 B     aaa      13    20
12 C     aaa      20    20
13 A     ddd      11    18
14 B     ddd      18    18
15 C     ddd       6    18
16 A     ddd       9    18
17 B     ddd      10    18
18 C     ddd      13    18

我想要创建另一个变量,它将使每一行的最大值增加1(按变量tat分组)。请找一个例子说明我在下面所拥有的东西。有人有办法这么做吗?

代码语言:javascript
复制
> data2
# A tibble: 18 x 5
# Groups:   tat [3]
   dat   tat     pct   max  ...5
   <chr> <chr> <dbl> <dbl> <dbl>
 1 A     ttt      14    14    14
 2 B     ttt       7    14    15
 3 C     ttt      12    14    16
 4 A     ttt       8    14    17
 5 B     ttt      11    14    18
 6 C     ttt      13    14    19
 7 A     aaa      19    20    20
 8 B     aaa       6    20    21
 9 C     aaa       9    20    22
10 A     aaa      11    20    23
11 B     aaa      13    20    24
12 C     aaa      20    20    25
13 A     ddd      11    18    18
14 B     ddd      18    18    19
15 C     ddd       6    18    20
16 A     ddd       9    18    21
17 B     ddd      10    18    22
18 C     ddd      13    18    23
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2021-07-01 16:02:17

这是否有效:

代码语言:javascript
复制
library(dplyr)

data %>% group_by(tat) %>% mutate(c5 = max + row_number() - 1)
# A tibble: 18 x 5
# Groups:   tat [3]
   dat   tat     pct   max    c5
   <chr> <chr> <dbl> <dbl> <dbl>
 1 A     ttt      14    14    14
 2 B     ttt       7    14    15
 3 C     ttt      12    14    16
 4 A     ttt       8    14    17
 5 B     ttt      11    14    18
 6 C     ttt      13    14    19
 7 A     aaa      19    20    20
 8 B     aaa       6    20    21
 9 C     aaa       9    20    22
10 A     aaa      11    20    23
11 B     aaa      13    20    24
12 C     aaa      20    20    25
13 A     ddd      11    18    18
14 B     ddd      18    18    19
15 C     ddd       6    18    20
16 A     ddd       9    18    21
17 B     ddd      10    18    22
18 C     ddd      13    18    23
票数 2
EN

Stack Overflow用户

发布于 2021-07-01 16:20:27

当by变量被排序时,您可以在基本R4.1.0或更高版本中这样做:

代码语言:javascript
复制
datf |> within(
  max_plus <- unlist(tapply(pct, factor(tat, unique(tat)), 
                            function(x) max(x) + seq_along(x) - 1)))
#R>    dat tat pct max_plus
#R> 1    A ttt  14       14
#R> 2    B ttt   7       15
#R> 3    C ttt  12       16
#R> 4    A ttt   8       17
#R> 5    B ttt  11       18
#R> 6    C ttt  13       19
#R> 7    A aaa  19       20
#R> 8    B aaa   6       21
#R> 9    C aaa   9       22
#R> 10   A aaa  11       23
#R> 11   B aaa  13       24
#R> 12   C aaa  20       25
#R> 13   A ddd  11       18
#R> 14   B ddd  18       19
#R> 15   C ddd   6       20
#R> 16   A ddd   9       21
#R> 17   B ddd  10       22
#R> 18   C ddd  13       23

按照注释中的onyambu's答案,可以使用ave

代码语言:javascript
复制
dat= rep(c("A", "B", "C"),3)
tat=c(rep("ttt", 6), rep("aaa", 6), rep("ddd", 6))
pct=c(14,7,12,8,11,13,19,6,9,11,13,20,11,18,6,9,10,13)
datf <- data.frame(dat, tat, pct)

transform(datf, max_plus = 
            ave(pct, tat, FUN = function(x) max(x) + seq_along(x) - 1))
#R>    dat tat pct max_plus
#R> 1    A ttt  14       14
#R> 2    B ttt   7       15
#R> 3    C ttt  12       16
#R> 4    A ttt   8       17
#R> 5    B ttt  11       18
#R> 6    C ttt  13       19
#R> 7    A aaa  19       20
#R> 8    B aaa   6       21
#R> 9    C aaa   9       22
#R> 10   A aaa  11       23
#R> 11   B aaa  13       24
#R> 12   C aaa  20       25
#R> 13   A ddd  11       18
#R> 14   B ddd  18       19
#R> 15   C ddd   6       20
#R> 16   A ddd   9       21
#R> 17   B ddd  10       22
#R> 18   C ddd  13       23
票数 2
EN

Stack Overflow用户

发布于 2021-07-01 16:50:27

使用data.table

代码语言:javascript
复制
library(data.table)
setDT(data)[, c5 := max + (seq_len(.N) - 1), tat]
> data
    dat tat pct max c5
 1:   A ttt  14  14 14
 2:   B ttt   7  14 15
 3:   C ttt  12  14 16
 4:   A ttt   8  14 17
 5:   B ttt  11  14 18
 6:   C ttt  13  14 19
 7:   A aaa  19  20 20
 8:   B aaa   6  20 21
 9:   C aaa   9  20 22
10:   A aaa  11  20 23
11:   B aaa  13  20 24
12:   C aaa  20  20 25
13:   A ddd  11  18 18
14:   B ddd  18  18 19
15:   C ddd   6  18 20
16:   A ddd   9  18 21
17:   B ddd  10  18 22
18:   C ddd  13  18 23
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68213450

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档