R 更新重复行中的单个值

R 更新重复行中的单个值,r,R,假设我有一个包含重复记录的数据帧: 数据 是预期结果,Amount1中的值已通过将前一行的值除以2进行更新 # ID Amount1 Amount2 Dupl #1: A 100 1500 2 #2: A 50 1500 2 #3: A 200 1500 0 #4: B 300 2400 1 #5: B 400 2400 3 #6: B 200 2400 3

假设我有一个包含重复记录的数据帧:

数据 是预期结果,Amount1中的值已通过将前一行的值除以2进行更新

#   ID Amount1 Amount2 Dupl
#1:  A     100    1500    2
#2:  A     50     1500    2
#3:  A     200    1500    0
#4:  B     300    2400    1
#5:  B     400    2400    3
#6:  B     200    2400    3
#7:  B     100    2400    3

我们可以
rep
按“Dupl”列对行序列进行复制以扩展数据集,然后使用
Reduce
更新“Amount1”列

library(data.table)
dt[, i1 := seq_len(.N)][rep(seq_len(.N), pmax(Dupl, 1))][, 
  Amount1 := Reduce(function(x, y) x/2, Amount1, accumulate = TRUE), 
     i1][, i1 := NULL][]
#   ID Amount1 Amount2 Dupl
#1:  A     100    1500    2
#2:  A      50    1500    2
#3:  A     200    1500    0
#4:  B     300    2400    1
#5:  B     400    2400    3
#6:  B     200    2400    3
#7:  B     100    2400    3

或者另一个选项是创建一个2的倍数的
seq
余数,并为每个'i1'除以'Amount1'

dt[, i1 := seq_len(.N)][rep(seq_len(.N), pmax(Dupl, 1))][, 
    Amount1 := c(first(Amount1), Amount1[-1]/seq(2, 
           length.out = .N-1, by = 2)), i1][, i1 := NULL][]

或者使用
tidyverse

library(dplyr)
library(tidyr)
library(purrr)
dt %>%
   mutate(i1 = row_number()) %>%
   uncount(pmax(Dupl, 1)) %>%
   group_by(i1) %>% 
   mutate(Amount1 = accumulate(Amount1, ~ .x/2)) %>%
   ungroup %>%
   select(-i1)
# A tibble: 7 x 4
#  ID    Amount1 Amount2  Dupl
#  <chr>   <dbl>   <dbl> <dbl>
#1 A         100    1500     2
#2 A          50    1500     2
#3 A         200    1500     0
#4 B         300    2400     1
#5 B         400    2400     3
#6 B         200    2400     3
#7 B         100    2400     3
库(dplyr)
图书馆(tidyr)
图书馆(purrr)
dt%>%
变异(i1=行数())%>%
取消计数(pmax(Dupl,1))%>%
分组依据(i1)%>%
突变(数量1=累积(数量1,~.x/2))%>%
解组%>%
选择(-i1)
#一个tibble:7x4
#ID数量1数量2重复
#         
#1 A 100 1500 2
#2 A 50 1500 2
#3 A 200 1500 0
#4 B 300 2400 1
#5 B 400 2400 3
#6 B 200 2400 3
#7 B 100 2400 3

是否可以在创建副本的同时更改Amount1列中的值?@capiono您能检查我的更新吗?这是你期望的吗output@capiono如果您检查我的前两个解决方案,它将通过复制同一行值来进行更新。感谢@arun在这方面的帮助。我已经更新了我的问题。我对所有列都感兴趣,但是Amount1列中的值需要在新行中通过将前一行的值除以2来更新
dt[, i1 := seq_len(.N)][rep(seq_len(.N), pmax(Dupl, 1))][, 
    Amount1 := c(first(Amount1), Amount1[-1]/seq(2, 
           length.out = .N-1, by = 2)), i1][, i1 := NULL][]
library(dplyr)
library(tidyr)
library(purrr)
dt %>%
   mutate(i1 = row_number()) %>%
   uncount(pmax(Dupl, 1)) %>%
   group_by(i1) %>% 
   mutate(Amount1 = accumulate(Amount1, ~ .x/2)) %>%
   ungroup %>%
   select(-i1)
# A tibble: 7 x 4
#  ID    Amount1 Amount2  Dupl
#  <chr>   <dbl>   <dbl> <dbl>
#1 A         100    1500     2
#2 A          50    1500     2
#3 A         200    1500     0
#4 B         300    2400     1
#5 B         400    2400     3
#6 B         200    2400     3
#7 B         100    2400     3