2017-01-11 21 views
0

我有一個data.frame(tt)的4列,其中每個條目有一個ID標籤根據哪個人進行了測量。我想用最小的每個ID來劃分SkinTemp數據:基於ID劃分所有數據由另一個data.frame

dput(head(tt,10)) 
structure(list(id = c("1", "1", "1", "1", "1", "1", "1", "1", 
"1", "1"), Time = c(139, 139, 139, 139, 139, 139, 139, 139, 139, 
139), SkinTemp = c(29.559, 29.561, 29.563, 29.564, 29.566, 29.568, 
29.57, 29.572, 29.574, 29.576), HeartRate = c(33.689, 33.689, 
33.689, 33.689, 33.689, 33.689, 33.689, 33.689, 33.689, 33.689 
), RespirationRate = c(11.641, 11.641, 11.641, 11.641, 11.641, 
11.641, 11.641, 11.641, 11.641, 11.641)), .Names = c("id", "Time", 
"SkinTemp", "HeartRate", "RespirationRate"), row.names = c(NA, 
10L), class = "data.frame") 

我隨後發現基於ID的最低每皮膚溫度:

TempMins <-aggregate(tt$SkinTemp, by=list(minID=tt$id), FUN=min, na.rm=TRUE) 
dput(head(TempMins)) 

這給了我如下:

structure(list(minID = c("1", "10", "11", "12", "13", "14" 
), x = c(29.559, 21.57, 30.311, 34.754, 20.57, 22.879)), .Names = c("minID", 
"x"), row.names = c(NA, 6L), class = "data.frame") 

如何將原始數據中的所有皮膚溫度(通過ID分組)分爲每個ID的最小值?

我認爲有這個功能,但我似乎無法在谷歌上受到重創。

+1

'library(dplyr); df%>%group_by(id)%>%mutate(SkinTemp/min(SkinTemp))' –

回答

1

我們可以使用data.table而不創建新的聚合數據集。轉換 'data.frame' 到 'data.table'(setDT(tt)),由 'ID' 進行分組,我們通過的 'SkinTemp'

min將 'SkinTemp' 的值賦給( :=)的 'SkinTemp'
library(data.table) 
setDT(tt)[, SkinTemp := SkinTemp/min(SkinTemp), by = id] 

一個base R選項ave

tt$SkinTemp <- with(tt, SkinTemp/ave(SkinTemp, id, FUN = min)) 
+0

非常感謝您的幫助。我想用你的答案來回答,因爲使用了R基礎,我可以看到它實際上做得更好。 – HCAI

1

可以按如下方式與dplyr做到這一點。您可以重複使用聚合數據,而不必合併兩套,因爲我用mutate代替summarise這裏:

tt %>% group_by(id) %>% mutate(SkinTempDivMinTemp = SkinTemp/min(SkinTemp, na.rm=T)) 

根據自己的喜好使用data.tabledplyr方法。

+0

非常感謝您的回答。我決定和akrun的答案一起去,只是因爲我更喜歡在R中工作,因爲我不確定更復雜的東西是什麼意思(例如%/%)。 – HCAI

+0

沒問題。這可能是我還沒有使用data.table的原因。我可以說從數據操縱的R基礎切換到'dplyr'到目前爲止幫助了我很多。 – Wietze314

+0

我昨天開始使用它,所以仍然需要解決所有錯綜複雜的問題,但它看起來非常有用。 – HCAI

相關問題