创建一个循环以在rep调用中查找更改的值

时间:2017-06-28 11:29:31

标签: r loops

考虑一个数据帧,其中n组观测值具有5个变量的频率值(A-E))

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)五次(对于每个变量)写入新列来手动分配:

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] ..

请注意,群组名称实际上有所不同(因为它们代表生物类群)。谢谢。

2 个答案:

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

答案 1 :(得分: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