2017-01-06 20 views
2

我想使用dplyr來計算每個訪問對象的兩個因子比率的向量。使用dplyr計算每個訪問的兩個因子的比率

subj = c(rep("A", 10), rep("B", 4), rep("C", 6)) 
vist = c(rep(c("C0", "C1", "C2", "C3", "C4"), each=2), 
     rep(c("C0", "C1"), each=2), 
     rep(c("C0", "C1", "C2"), each=2)) 
factor = c(rep(c("L", "N"), 5), rep(c("L", "N"), 2), rep(c("L", "N"), 3)) 
set.seed(111) 
aval = round(rnorm(n = 20, 0, 1), 2) 

dat = data.frame(subj, vist, factor, aval, stringsAsFactors = FALSE) 
dat 

看起來像:

subj vist factor aval 
1  A C0  L 0.24 
2  A C0  N -0.33 
3  A C1  L -0.31 
4  A C1  N -2.30 
5  A C2  L -0.17 
6  A C2  N 0.14 
7  A C3  L -1.50 
8  A C3  N -1.01 
9  A C4  L -0.95 
10 A C4  N -0.49 
11 B C0  L -0.17 
12 B C0  N -0.41 
13 B C1  L 1.85 
14 B C1  N 0.39 
15 C C0  L 0.80 
16 C C0  N -1.57 
17 C C1  L -0.09 
18 C C1  N -0.36 
19 C C2  L -1.19 
20 C C2  N 0.36 

所需要的是的值(aval)的因子(factor)之比 「N」 比 「L」 的模擬數據在下面可以創建,每次訪問的每個主題(subj)(vist)。例如,第一個比率值將是-1.375,來自-0.33/0.24。謝謝!

回答

3

可以重塑與spread從tidyr包中的數據,那麼可以很容易地計算出新的列:

library(tidyr) 
library(dplyr) 
dat %>% 
    spread(factor, aval) %>% 
    mutate(ratio = N/L) 


    subj vist  L  N  ratio 
1  A C0 0.24 -0.33 -1.3750000 
2  A C1 -0.31 -2.30 7.4193548 
3  A C2 -0.17 0.14 -0.8235294 
4  A C3 -1.50 -1.01 0.6733333 
5  A C4 -0.95 -0.49 0.5157895 
6  B C0 -0.17 -0.41 2.4117647 
7  B C1 1.85 0.39 0.2108108 
8  C C0 0.80 -1.57 -1.9625000 
9  C C1 -0.09 -0.36 4.0000000 
10 C C2 -1.19 0.36 -0.3025210 
1

如果每組只有一個NL,你可以這樣做:

dat %>% 
     group_by(subj, vist) %>% 
     summarise(ratio = aval[factor == "N"]/aval[factor == "L"]) 

#Source: local data frame [10 x 3] 
#Groups: subj [?] 

# subj vist  ratio 
# <chr> <chr>  <dbl> 
#1  A C0 -1.3750000 
#2  A C1 7.4193548 
#3  A C2 -0.8235294 
#4  A C3 0.6733333 
#5  A C4 0.5157895 
#6  B C0 2.4117647 
#7  B C1 0.2108108 
#8  C C0 -1.9625000 
#9  C C1 4.0000000 
#10  C C2 -0.3025210 
1

在基數R中,您可以使用aggregate構造比率摘要或ave以將這些比率填充到原始數據框架中。這假定data.frame是規則的並且正確排序。

aggregate(dat$aval, dat[c("subj", "vist")], FUN=function(x) x[2]/x[1]) 
    subj vist   x 
1  A C0 -1.3750000 
2  B C0 2.4117647 
3  C C0 -1.9625000 
4  A C1 7.4193548 
5  B C1 0.2108108 
6  C C1 4.0000000 
7  A C2 -0.8235294 
8  C C2 -0.3025210 
9  A C3 0.6733333 
10 A C4 0.5157895 

dat$rat <- ave(dat$aval, dat$subj, dat$vist, FUN=function(x) x[2]/x[1]) 

將其添加爲變量。

1

如果這些是按照相同的順序,並且每個每個「SUBJ」恰好一個對,「VIST」

dat$ratio <- rep(dat$aval[c(FALSE, TRUE)]/dat$aval[c(TRUE, FALSE)], each = 2) 
dat$ratio 
#[1] -1.3750000 -1.3750000 7.4193548 7.4193548 -0.8235294 -0.8235294 
#[7] 0.6733333 0.6733333 0.5157895 0.5157895 2.4117647 2.4117647 
#[13] 0.2108108 0.2108108 -1.9625000 -1.9625000 4.0000000 4.0000000 
#[19] -0.3025210 -0.3025210