【发布时间】:2020-03-30 17:23:23
【问题描述】:
有谁知道是否可以在一个数据框中使用变量(在我的情况下是“部署”数据框)在另一个数据框中创建变量?
例如,我有两个数据框:
df1:
deploy <- data.frame(ID = c("20180101_HH1_1_1", "20180101_HH1_1_2", "20180101_HH1_1_3"),
Site_Depth = c(42, 93, 40), Num_Depth_Bins_Required = c(5, 100, 4),
Percent_Column_in_each_bin = c(20, 10, 25))
df2:
sp.c <- data.frame(species = c("RR", "GS", "GT", "BR", "RS", "BA", "GS", "RS", "SH", "RR"),
ct = c(25, 66, 1, 12, 30, 6, 1, 22, 500, 6),
percent_dist_from_surf = c(11, 15, 33, 68, 71, 100, 2, 65, 5, 42))
我想在 df2 中创建新列,根据每个 ID 的 Percent_Column_in_each_bin 分配每个物种并计数到一个 bin。例如,在 20180101_HH1_1_3 中,将有 4 个 bin,每个 bin 占该列的 25%,所有在该列 0-25% 范围内的物种(在 df2 中)将在 bin 1 中,物种在该列的 25-50% 范围内。列将在深度 bin 2 中,依此类推。我想象的这个样子是:
i.want.this <- data.frame(species = c("RR", "GS", "GT", "BR", "RS", "BA", "GS", "RS", "SH", "RR"),
ct = c(25, 66, 1, 12, 30, 6, 1, 22, 500, 6),
percent_dist_from_surf = c(11, 15, 33, 68, 71, 100, 2, 65, 5, 42),
'20180101_HH1_1_1_Bin' = c(1, 1, 2, 4, 4, 5, 1, 4, 1, 3),
'20180101_HH1_1_2_Bin' = c(2, 2, 4, 7, 8, 10, 1, 7, 1, 5),
'20180101_HH1_1_3_Bin' = c(1, 1, 2, 3, 3, 4, 1, 3, 1, 2))
我对 R 很陌生,但我不确定如何实现这一点。我需要为超过 100 个 ID 执行此操作(所有 ID 都具有不同的深度、深度箱的数量以及每个箱中的列百分比),所以我希望我不需要全部手动完成。我曾尝试在 dplyr 中进行 mutate,但无法从两个不同的数据帧中提取它。我也尝试过 ifelse 语句,但我需要为每个 ID 单独运行 ifelse 语句。
我不知道我正在尝试做的事情是否可行,但我感谢您的反馈。先感谢您!
编辑:我的最终目标是为每个 ID 的每个 bin 中的每个物种找到最大计数(最大 ct)。我一直在寻找这个(使用@Ben 的建议生成的垃圾箱)正在使用 dplyr 来切片并找到最大 ID,如下所示:
20180101_HH1_1_1 <- sp.c %>%
group_by(20180101_HH1_1_1, species) %>%
arrange(desc(ct)) %>%
slice(1) %>%
group_by(20180101_HH1_1_1) %>%
mutate(Count_Total_Per_Bin = sum(ct)) %>%
group_by(species, add=TRUE) %>%
mutate(species_percent_of_total_in_bin =
paste0((100*ct/Count_Total_Per_Bin) %>%
mutate(ID= "20180101_HH1_1_1 ") %>%
ungroup()
但我必须为超过 100 个 ID 执行此操作。我想要的输出是这样的:
end.goal <- data.frame(ID = c(rep("20180101_HH1_1_1", 8)),
species = c("RR", "GS", "SH", "GT", "RR", "BR", "RS", "BA"),
bin = c(1, 1, 1, 2, 3, 4, 4, 5),
Max_count_of_each_species_in_each_bin = c(11, 66, 500, 1, 6, 12, 30, 6),
percent_dist_from_surf = c(11, 15, 5, 33, 42, 68, 71, 100),
percent_each_species_max_in_each_bin = c((11/577)*100, (66/577)*100, (500/577)*100, 100, 100, (12/42)*100, (30/42)*100, 100))
我在想,通过回答最初的问题,我可以解决这个问题,但我现在看到,要为每个 ID 获取这个问题,您仍然需要做很多事情。
【问题讨论】: