R 数据表:“;“集团计数器”;基于给定列或另一列

R 数据表:“;“集团计数器”;基于给定列或另一列,r,data.table,R,Data.table,我有这个数据。表: > DT <- data.table(x = c(15,48,NA,NA,NA,45,45,45,45,75,75,75,NA,2,3,1), y = c(74,159,120,120,120,14,14,14,14,12,23,23,8,8,8,8)) > DT x y 1: 15 74 2: 48 159 3: NA 120 4: NA 120 5: NA 120 6: 45 14 7: 45 14 8: 45 14

我有这个
数据。表

> DT <- data.table(x = c(15,48,NA,NA,NA,45,45,45,45,75,75,75,NA,2,3,1), y = c(74,159,120,120,120,14,14,14,14,12,23,23,8,8,8,8))
> DT
     x   y
 1: 15  74
 2: 48 159
 3: NA 120
 4: NA 120
 5: NA 120
 6: 45  14
 7: 45  14
 8: 45  14
 9: 45  14
10: 75  12
11: 75  23
12: 75  23
13: NA   8
14:  2   8
15:  3   8
16:  1   8

以下是在某些条件下使用
cumsum
的方法:

DT[, cumsum(c(1, tail(pmin(x!=shift(x), y!=shift(y),na.rm=TRUE), -1)))]
[1] 1 2 3 3 3 4 4 4 4 5 5 5 6 6 6 6
x!=shift(x)
比较列中的相邻元素(与y相同)并返回逻辑值。
pmin
函数比较逻辑比较的结果并选择每个元素的最小值,即如果任一向量的元素没有变化,则观察值标记为未变化。
tail
函数删除初始NA,而
cumsum
函数将结果相加到所需的向量中

请注意,此方法将生成NAs,其中x和y的观测值都有NAs。在使用
cumsum
之前,您可以在附加步骤中解决此问题


这将对字符变量起作用:

# same data.table with character variables
DT <- data.table(x = as.character(c(15,48,NA,NA,NA,45,45,45,45,75,75,75,NA,2,3,1)),
                 y = as.character(c(74,159,120,120,120,14,14,14,14,12,23,23,8,8,8,8)))

DT[, cumsum(c(1, tail(pmin(x!=shift(x), y!=shift(y),na.rm=TRUE), -1)))]
 [1] 1 2 3 3 3 4 4 4 4 5 5 5 6 6 6 6

我不知道你想怎样治疗NAs。如果有一个额外的行
17:NA 8
,你会给它索引6还是索引7?结果将是索引6(即
17:NA 8 6
)。我想你是说,当且仅当两个X相同或两个Y相同时,两个连续行应该在同一组中。我想我是想问
NA
在这里是否特别。如果两个连续的X都
NA
,这算是相同的吗?我猜这方面的一个例子是将第
4:
行中的
120
更改为
121
,这会改变分组吗?是的,如果4:NA 121,分组会改变。对于x列和y列,我没有同时包含NA的行。是的,我刚刚看到了这一点。我想
c(1,tail(x,-1))
也可以写成
replace(x,1,1)
替换
replace
c(1,tail)
相比,是否有一个有效的论据,或者只是它读起来更好?我记得测试
replace
时,我看到akrun在使用它,发现它是复制的。不,没有参数,可能更适合可读性。@Nell如果你用字符变量试试这个,我认为应该可以,因为变量只用于相等性测试(
!=
)@Nell这适用于字符变量:查看我的更新答案。事实上,它将使用一个字符变量和一个数字变量。
# same data.table with character variables
DT <- data.table(x = as.character(c(15,48,NA,NA,NA,45,45,45,45,75,75,75,NA,2,3,1)),
                 y = as.character(c(74,159,120,120,120,14,14,14,14,12,23,23,8,8,8,8)))

DT[, cumsum(c(1, tail(pmin(x!=shift(x), y!=shift(y),na.rm=TRUE), -1)))]
 [1] 1 2 3 3 3 4 4 4 4 5 5 5 6 6 6 6
str(DT)
Classes ‘data.table’ and 'data.frame':  16 obs. of  2 variables:
 $ x: chr  "15" "48" NA NA ...
 $ y: chr  "74" "159" "120" "120" ...
 - attr(*, ".internal.selfref")=<externalptr>