R 满足条件时按组排第一行

标签 r data.table

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/

相关文章:

r - data.table 未按两列正确汇总

r - 如何比较一行中的任何元素是否相同

r - 使用 seq 矢量方式

R data.table,访问赋值函数内的矩阵

r - 如何从 gwidgets 中的函数返回值

r - 在 R 中使用西类牙语文本创建语料库

r - 如何加入位置数据(纬度,经度)

r - 为mtcars数据集运行glmnet()问题

在 dplyr 的 group_by 中有条件地删除重复行

r - 与 data.table 进行 "fuzzy"和非模糊多对一合并