dataHAVE=data.frame(STUDENT=c(1,1,1,2,2,2,3,3,3),
SCORE=c(0,1,1,5,1,2,1,1,1),
CAT=c(3,10,7,4,5,0,4,5,1),
FOX=c(5,0,10,8,9,1,8,9,0))
dataWANT=data.frame(STUDENT=c(1,2,3),
SCORE=c(1,1,1),
CAT=c(10,5,4),
FOX=c(0,9,8))
我有“dataHAVE”并且想要“dataWANT”,它在“SCORE”等于 1 时为每个“STUDENT”占据第一行。我正在寻找一个 data.table 解决方案,因为它是一个大数据。我试过了,但不知道如何设置“SCORE”的标准
dataWANT[,.SD[1],by = key(STUDENT)]
最佳答案
将'data.frame'转换为'data.table'(setDT
),按'STUDENT'分组,在i
中指定逻辑条件,得到索引第一行 (.I[1]
),提取该列 ($V1
) 并对行进行子集化
library(data.table)
setDT(dataHAVE)[dataHAVE[SCORE == 1, .I[1], STUDENT]$V1]
.I
返回行索引。如果我们没有分组列,它将返回一个 vector
即
setDT(dataHAVE)[SCORE == 1, .I]
#[1] 1 2 3 4 5 6
当我们提供分组列时,默认情况下,.I
返回一个命名列 V1
(我们可以通过更改名称来覆盖它)
setDT(dataHAVE)[SCORE == 1, .(colindex = .I[1]), STUDENT]
# STUDENT colindex
#1: 1 2
#2: 2 5
#3: 3 7
现在,我们有两列,'STUDENT','colindex'。我们对“colindex”特别感兴趣,因此使用标准程序($
或 [[
)进行提取,然后将其用作 i
中的行索引>
i1 <- setDT(dataHAVE)[SCORE == 1, .(colindex = .I[1]), STUDENT]$colindex
i1
#[1] 2 5 7
我们用它来进行子集化
dataHAVE[i1]
关于R 满足条件时按组排第一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63606501/