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)
我希望每個第一行與一個參考行的所有行,對於每種類型的變量Ñ(A,B,C),爲基準的行。我想劃分每行,在n的每個類別中除以參考行(包括參考行本身)。我想我必須使用一些應用功能,但我不知道如何攻擊這個功能。
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)
我希望每個第一行與一個參考行的所有行,對於每種類型的變量Ñ(A,B,C),爲基準的行。我想劃分每行,在n的每個類別中除以參考行(包括參考行本身)。我想我必須使用一些應用功能,但我不知道如何攻擊這個功能。
我們可以使用data.table
。由「n」個,循環通過其他列轉換「data.frame」到「data.table」(setDT(df)
),組,由參考行分(第一行 - 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"))
隨着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
也就是說輝煌!我必須學習數據表!如果我有一個非數字列* n2 *,我想保持不變,這也是可能的嗎? – Erosennin
@Erosennin我剛更新了帖子 – akrun
非常感謝! – Erosennin