R 更新重复行中的单个值
假设我有一个包含重复记录的数据帧: 数据 是预期结果,Amount1中的值已通过将前一行的值除以2进行更新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
# 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