考虑一个数据帧,其中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] ..
请注意,群组名称实际上有所不同(因为它们代表生物类群)。谢谢。
答案 0 :(得分:3)
如果我理解您想要的输出,我们可以使用dplyr
和tidyr::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