[英]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.