2017-01-19 126 views
1
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對於每個變量類型,劃分

我希望每個第一行與一個參考行的所有行,對於每種類型的變量Ñ(A,B,C),爲基準的行。我想劃分每行,在n的每個類別中除以參考行(包括參考行本身)。我想我必須使用一些應用功能,但我不知道如何攻擊這個功能。

回答

1

我們可以使用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")) 
+1

也就是說輝煌!我必須學習數據表!如果我有一個非數字列* n2 *,我想保持不變,這也是可能的嗎? – Erosennin

+0

@Erosennin我剛更新了帖子 – akrun

+1

非常感謝! – Erosennin

1

隨着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 
+1

2分鐘後。也許你還應該包括'data.frame(df [c(1:2)],sapply(df [-c(1,2)],函數(i)ave(i,df $ n,FUN = function )j/j [1])))'使它更完整 – Sotos

+0

我看到了,謝謝你的幫助!非常感激! – Erosennin