如何在一个列中每次满足给定条件时为另一个列分配累进数?给定以下数据:
a <- data.frame(var = c(1, 0, 0, 1, 4, 5, 6, 1, 7, 1, 1))
我想构造一个列,每次var == 1时递增1,其余部分返回NA。新列应填充:
1, NA, NA, 2, NA, NA, NA, 3, NA, 4, 5
我想了想,但我没有设法使它工作。谢谢!
c7rzv4ha1#
可以使用ifelse和cumsum:
ifelse
cumsum
a$newvar <- ifelse(a$var==1, cumsum(a$var==1), NA) var newvar 1 1 1 2 0 NA 3 0 NA 4 1 2 5 4 NA 6 5 NA 7 6 NA 8 1 3 9 7 NA 10 1 4 11 1 5
b1payxdu2#
我只想在一般情况下再补充一点如果你想对4或5或其他任何东西做同样的事情
a <- data.frame(var = c(1, 0, 0, 1, 4, 5, 6, 1, 7, 1, 1)) a$New <- ifelse(a$var == 1,1,NA) a$New[!is.na(a$New)] <- cumsum(a$New[!is.na(a$New)])
输出:
> print(a) var New 1 1 1 2 0 NA 3 0 NA 4 1 2 5 4 NA 6 5 NA 7 6 NA 8 1 3 9 7 NA 10 1 4 11 1 5
k7fdbhmy3#
我们也可以用cumsum的变体来实现这一点
a$newVar <- with(a, cumsum(var ==1) * NA^(var!=1)) a$newVar #[1] 1 NA NA 2 NA NA NA 3 NA 4 5
或者使用data.table,我们将'data.frame'转换为'data.table'(setDT(a)),在'i'中指定逻辑条件(var == 1),并将'var'的cumsum赋值(:=它是有效的,因为它在适当的位置赋值)为'newvar'。默认情况下,'newvar'中与逻辑条件不对应的其他元素将由NA填充。
data.table
setDT(a)
var == 1
:=
library(data.table) setDT(a)[var==1, newvar := cumsum(var)] a # var newvar # 1: 1 1 # 2: 0 NA # 3: 0 NA # 4: 1 2 # 5: 4 NA # 6: 5 NA # 7: 6 NA # 8: 1 3 # 9: 7 NA #10: 1 4 #11: 1 5
或者我们可以使用行序列来代替cumsum
setDT(a)[var==1, newvar := seq_len(.N)]
ezykj2lf4#
另一个基本R选项,但没有cumsum
> transform(a, newvar = replace(NA*var, var==1, seq(sum(var==1)))) var newvar 1 1 1 2 0 NA 3 0 NA 4 1 2 5 4 NA 6 5 NA 7 6 NA 8 1 3 9 7 NA 10 1 4 11 1 5
4条答案
按热度按时间c7rzv4ha1#
可以使用
ifelse
和cumsum
:b1payxdu2#
我只想在一般情况下再补充一点如果你想对4或5或其他任何东西做同样的事情
输出:
k7fdbhmy3#
我们也可以用
cumsum
的变体来实现这一点或者使用
data.table
,我们将'data.frame'转换为'data.table'(setDT(a)
),在'i'中指定逻辑条件(var == 1
),并将'var'的cumsum
赋值(:=
它是有效的,因为它在适当的位置赋值)为'newvar'。默认情况下,'newvar'中与逻辑条件不对应的其他元素将由NA填充。或者我们可以使用行序列来代替
cumsum
ezykj2lf4#
另一个基本R选项,但没有
cumsum