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>