对于每个变量类型,将所有行除以一个引用行

时间:2017-01-19 11:01:09

标签: r

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)       

enter image description here

我希望每个第一行,对于每个类型的变量 n (A,B,C),作为参考行。我想将 n 的每个类别中的每一行划分为参考行(包括参考行本身)。我想我必须使用一些应用功能,但我不确定如何攻击它。

2 个答案:

答案 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