簡體   English   中英

R 按組查找兩個值之間的距離

[英]R Find Distance Between Two values By Group

HAVE = data.frame(INSTRUCTOR = c(1, 1, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3),
STUDENT = c(1, 2, 2, 2, 1, 3, 1, 1, 1, 1, 2, 1),
SCORE = c(10, 1, 0, 0, 7, 3, 5, 2, 2, 4, 10, 2),
TIME = c(1,1,2,3,2,1,1,2,3,1,1,2))
 
WANT = data.frame(INSTRUCTOR = c(1, 2, 3), 
SCORE.DIF = c(-9, NA, 6))

對於每個 INSTRUCTOR,我希望找到第一名和第二名 STUDENT 的 SCORE,然后減去他們的分數。 學生代碼各不相同,所以我不希望使用“==1”與“==2”

我嘗試:

HAVE[, .SD[1:2], by = 'INSTRUCTOR']

但不知道如何垂直減去並從 'HAVE' 獲得 'WANT' 數據框

library(data.table)
setDT(HAVE)
unique(HAVE, by = c("INSTRUCTOR", "STUDENT")
  )[, .(SCORE.DIF = diff(SCORE[1:2])), by = INSTRUCTOR]
#    INSTRUCTOR SCORE.DIF
#         <num>     <num>
# 1:          1        -9
# 2:          2        NA
# 3:          3         6

要使用您的新TIME變量,我們可以這樣做

HAVE[, .SD[which.min(TIME),], by = .(INSTRUCTOR, STUDENT)
  ][, .(SCORE.DIF = diff(SCORE[1:2])), by = INSTRUCTOR]
#    INSTRUCTOR SCORE.DIF
#         <num>     <num>
# 1:          1        -9
# 2:          2        NA
# 3:          3         6

人們可能會想用head(SCORE,2)替換SCORE[1:2] ,但這行不通:如果輸入的長度為 2, head(SCORE,2)將返回 length-1,就像講師 2(雖然有多次,但只有一名學生)。 當您在長度為 1(例如diff(1) )上運行diff時,它會返回一個長度為 0 的向量,在上面的data.table代碼中,對於教師 2,該向量減少為零行。但是,當只有一個學生時, SCORE[1:2]解析為c(SCORE[1], NA) ,diff 為 length-1(根據需要)和NA (根據需要)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM