我有一个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的最小值?
我认为这有一个功能,但我似乎无法在谷歌上获得成功。
答案 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.table
或dplyr
方法。