n = c(rep("A",3),rep("B",4),rep("C",3))
s = 1:10
b = 5:14
c = 20:29
df = data.frame(n, s, b, c)
我希望每个第一行,对于每个类型的变量 n (A,B,C),作为参考行。我想将 n 的每个类别中的每一行划分为参考行(包括参考行本身)。我想我必须使用一些应用功能,但我不确定如何攻击它。
答案 0 :(得分:3)
我们可以使用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"))
答案 1 :(得分:2)
使用base R
:
df[-1] <- as.data.frame(sapply(df[-1], function(col) ave(col, df$n, FUN=function(x) x / x[1])))
df
n s b c
1 A 1.000 1.000000 1.000000
2 A 2.000 1.200000 1.050000
3 A 3.000 1.400000 1.100000
4 B 1.000 1.000000 1.000000
5 B 1.250 1.125000 1.043478
6 B 1.500 1.250000 1.086957
7 B 1.750 1.375000 1.130435
8 C 1.000 1.000000 1.000000
9 C 1.125 1.083333 1.037037
10 C 1.250 1.166667 1.074074