我们可以用data.table
。将“data.frame”转换为“data.table”(setDT(df)
),按“n”分组,循环遍历其他列,除以参考行(第一行 -x[1]
)
library(data.table)
setDT(df)[, lapply(.SD, function(x) x/x[1]) , n]
如果需要的话可以分配它(:=
) 返回感兴趣的列
setDT(df)[, (2:ncol(df)) := lapply(.SD, function(x) x/x[1]) , n]
如果我们希望“n2”不受影响,则指定中的列.SDcols
nm1 <- setdiff(names(df), c("n", "n2"))
setDT(df)[, (nm1) := lapply(.SD, function(x) x/x[1]) , n, .SDcols = nm1]
或者另一个选择是dplyr
library(dplyr)
df %?%
group_by(n) %>%
mutate_each(funs(./.[1]), setdiff(names(.), "n2"))