r将摘要数据转换为出席/缺席数据
我在多个站点进行了5次存在/不存在度量,并将它们汇总在一起,最后得到了一个类似以下内容的数据框架:r将摘要数据转换为出席/缺席数据,r,dataframe,dplyr,R,Dataframe,Dplyr,我在多个站点进行了5次存在/不存在度量,并将它们汇总在一起,最后得到了一个类似以下内容的数据框架: df <- data.frame("site" = c("a", "b", "c"), "species1" = c(0, 2, 1), "species2" = c(5, 2, 4)) data.f
df <- data.frame("site" = c("a", "b", "c"),
"species1" = c(0, 2, 1),
"species2" = c(5, 2, 4))
data.frame("site" = ("a", "b", "c"),
"species1" = c(0,0,0,0,0, 1,1,0,0,0, 1,0,0,0,0),
"species2" = c(1,1,1,1,1, 1,1,0,0,0, 1,1,1,1,0))
我可以用以下方法复制每行5次:
df %>% slice(rep(1:n(), each = 5))
但我不知道如何将“2”改为“1,1,0,0”。理想情况下,1和0的顺序(在每个站点内)也是随机的(即“0,0,1,0,1”),但这可能太难了
任何帮助都将不胜感激。重复行后,您可以将行号与相应列的任何值进行比较,如果当前行号小于该值,则分配1
library(dplyr)
df %>%
slice(rep(seq_len(n()), each = 5)) %>%
group_by(site) %>%
mutate(across(starts_with('species'), ~+(row_number() <= first(.))))
#Use mutate_at with old dplyr
#mutate_at(vars(starts_with('species')), ~+(row_number() <= first(.)))
# site species1 species2
# <chr> <int> <int>
# 1 a 0 1
# 2 a 0 1
# 3 a 0 1
# 4 a 0 1
# 5 a 0 1
# 6 b 1 1
# 7 b 1 1
# 8 b 0 0
# 9 b 0 0
#10 b 0 0
#11 c 1 1
#12 c 0 1
#13 c 0 1
#14 c 0 1
#15 c 0 0
库(dplyr)
df%>%
切片(rep(seq_len(n()),每个=5))%>%
分组依据(站点)%>%
突变(通过('species')开始,~+(row\u number()我们也可以使用uncount
library(dplyr)
library(tidyr)
df %>%
uncount(max(species2), .remove = FALSE) %>%
group_by(site) %>%
mutate(across(starts_with('species'), ~ as.integer(row_number() <= first(.))))
# A tibble: 15 x 3
# Groups: site [3]
# site species1 species2
# <chr> <int> <int>
# 1 a 0 1
# 2 a 0 1
# 3 a 0 1
# 4 a 0 1
# 5 a 0 1
# 6 b 1 1
# 7 b 1 1
# 8 b 0 0
# 9 b 0 0
#10 b 0 0
#11 c 1 1
#12 c 0 1
#13 c 0 1
#14 c 0 1
#15 c 0 0
库(dplyr)
图书馆(tidyr)
df%>%
取消计数(最大值(规格2),.remove=FALSE)%>%
分组依据(站点)%>%
mutate(从('species')开始,~as.integer(row_number())太棒了。谢谢你。我似乎总是迷路于mutate。对不起,也许这是不礼貌的礼节。我不是有意冒犯你。我只是觉得使用uncount(我不知道存在)使它成为一个更干净的解决方案。再次感谢你的帮助。