将所有数据基于ID除以另一个data.frame

时间:2017-01-11 10:01:10

标签: r

我有一个4列的data.frame(tt),其中每个条目都有一个基于哪个人进行测量的ID标记。我想将SkinTemp数据除以每个ID的最小值:

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的最小值?

我认为这有一个功能,但我似乎无法在谷歌上获得成功。

2 个答案:

答案 0 :(得分:1)

我们可以使用data.table而无需创建新的聚合数据集。将'data.frame'转换为'data.table'(setDT(tt)),按'id'分组,我们通过将'SkinTemp'的值除以'SkinTemp'来分配(:=) “SkinTemp”的min

library(data.table)
setDT(tt)[, SkinTemp := SkinTemp/min(SkinTemp), by = id]

base R选项为ave

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

答案 1 :(得分:1)

您可以使用dplyr执行此操作,如下所示。您可以重用聚合数据而无需合并两个集合,因为我在此使用mutate而不是summarise

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

根据您的喜好使用data.tabledplyr方法。