2017-06-28 53 views
0

考慮一個數據幀變更值,其中觀測的n組具有5個變量(AE))創建一個循環來查找在一個代表呼叫

set.seed(1234) 
df <- data.frame(group=c(rep("g1",5), rep("g2",5), rep("g3",5)), 
       variable=LETTERS[1:5], 
       frequency=sample(1:10, 15, replace=T)) 

基團頻率值(G1,G2,G3 )但是具有不同的尺寸,例如g1 = 10,g2 = 20,g3 = 30。我想將它作爲數據框中的「偏移量」列來引入,以便稍後計算組成數據(頻率/偏移量)。 我可以手動分配這一點,由(10,20,30)5次(每個變量)寫入組大小到新列:

df$offset <- c(rep(10,5), rep(20,5), rep(30,5)) 
df$rel <- df$frequency/df$offset*100 

導致

df 
     group variable frequency offset  rel 
    1  g1  A   2  10 20.00000 
    2  g1  B   7  10 70.00000 
    3  g1  C   7  10 70.00000 
    4  g1  D   7  10 70.00000 
    5  g1  E   9  10 90.00000 
    6  g2  A   7  20 35.00000 
    7  g2  B   1  20 5.00000 
    8  g2  C   3  20 15.00000 
    9  g2  D   7  20 35.00000 
    10 g2  E   6  20 30.00000 
    11 g3  A   7  30 23.33333 
    12 g3  B   6  30 20.00000 
    13 g3  C   3  30 10.00000 
    14 g3  D  10  30 33.33333 
    15 g3  E   3  30 10.00000 

的問題是現在我有更多的組(120),我不想爲每個組手動分配偏移量。 我有一個向量

abund <- sample(1:100, 120, replace=TRUE) 

其中寫組的大小。 我可以使用此矢量圖將每個組的大小寫入rep調用df$offset

df$offset <- c(rep(abund[1],5), rep(abund[2],5), rep(abund[3],5), ..., rep(abund[i], 5)) 

我認爲它是一些for循環,但我不能自己處理這個。

對不起,無法提出一個更好的名字。

所需的輸出:

df 
     group variable frequency offset  rel 
    1  g1  A   2  abund[1] 20.00000 
    2  g1  B   7  abund[1] 70.00000 
    3  g1  C   7  abund[1] 70.00000 
    4  g1  D   7  abund[1] 70.00000 
    5  g1  E   9  abund[1] 90.00000 
    6  g2  A   7  abund[2] 35.00000 
    7  g2  B   1  abund[2] 5.00000 
    8  g2  C   3  abund[2] 15.00000 
    9  g2  D   7  abund[2] 35.00000 
    10 g2  E   6  abund[2] 30.00000 
    11 g3  A   7  abund[3] 23.33333 
    12 g3  B   6  abund[3] 20.00000 
    13 g3  C   3  abund[3] 10.00000 
    14 g3  D  10  abund[3] 33.33333 
    15 g3  E   3  abund[3] 10.00000 
    .. gi  A   n  abund[i] .. 
    .. gi  B   n  abund[i] .. 
    .. gi  C   n  abund[i] .. 
    .. gi  D   n  abund[i] .. 
    .. gi  E   n  abund[i] .. 

請注意,組名稱實際上是不同的(它們所代表的生物類羣)。謝謝。

+0

另外請加'set.seed'使'sample'重複性 – Sotos

+0

取代= F改爲取代= T – nouse

+0

你能也添加您想要的結果? –

回答

3

如果我理解你想要的輸出,我們可以dplyrtidyr::nest

library(tidyr) 
library(dplyr) 

set.seed(1234) 
df <- data.frame(group=c(rep("g1",5), rep("g2",5), rep("g3",5)), 
       variable=LETTERS[1:5], 
       frequency=sample(1:10, 15, replace=TRUE)) 

abund <- sample(1:100, 120, replace=TRUE) 
#abund[1:3] is 84 29 27 
df %>% 
    nest(-group) %>% 
    mutate(offset = abund[1:length(group)]) %>% 
    unnest() %>% 
    mutate(frequency = frequency/offset) 
# A tibble: 15 <U+00D7> 4 
    group offset variable frequency 
    <fctr> <int> <fctr>  <dbl> 
1  g1  84  A 0.02380952 
2  g1  84  B 0.08333333 
3  g1  84  C 0.08333333 
4  g1  84  D 0.08333333 
5  g1  84  E 0.10714286 
6  g2  29  A 0.24137931 
7  g2  29  B 0.03448276 
8  g2  29  C 0.10344828 
9  g2  29  D 0.24137931 
10  g2  29  E 0.20689655 
11  g3  27  A 0.25925926 
12  g3  27  B 0.22222222 
13  g3  27  C 0.11111111 
14  g3  27  D 0.37037037 
15  g3  27  E 0.11111111 
+0

,看起來很有希望在我的現實生活中的例子。非常感謝你。 – nouse

1

也許是這樣做呢?

df$offset <- rep(sample(1:100, nrow(df)/5, replace=TRUE),each=5) 
df$rel <- df$frequency/df$offset*100 

    group variable frequency offset  rel 
1  g1  A   2  84 2.380952 
2  g1  B   7  84 8.333333 
3  g1  C   7  84 8.333333 
4  g1  D   7  84 8.333333 
5  g1  E   9  84 10.714286 
6  g2  A   7  29 24.137931 
7  g2  B   1  29 3.448276 
8  g2  C   3  29 10.344828 
9  g2  D   7  29 24.137931 
10 g2  E   6  29 20.689655 
11 g3  A   7  27 25.925926 
12 g3  B   6  27 22.222222 
13 g3  C   3  27 11.111111 
14 g3  D  10  27 37.037037 
15 g3  E   3  27 11.111111