如果满足条件,则分配累进编号- R

mgdq6dx1  于 2023-04-27  发布在  其他
关注(0)|答案(4)|浏览(116)

如何在一个列中每次满足给定条件时为另一个列分配累进数?给定以下数据:

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

我想了想,但我没有设法使它工作。谢谢!

c7rzv4ha

c7rzv4ha1#

可以使用ifelsecumsum

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
b1payxdu

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
k7fdbhmy

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填充。

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)]
ezykj2lf

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

相关问题