问题描述
我有一个基于先前研究的数据集,但包含许多全新的条目。清理后的数据集包含我使用 summarise
中的 tidyverse
函数创建的研究中包含的每个物种的平均值。
df<-data.frame(species = c("Species1","Species1","Species2","Species3","Species3"),new=c(TRUE,TRUE,FALSE,FALSE),var=c(1,1,2,3,3))
df2<-df%>%
group_by(species)%>%
summarise(var=mean(var))
我有一栏列出了观察结果是研究中的新观察还是从父研究中得出的。我想要做的是在清理过的数据框中创建一个向量,以便我可以轻松地显示和总结这项研究添加了多少新物种。有一些观察结果是已经存在的物种的额外数据,但其他物种对目前的分析来说是全新的。我试图找出一种方法来创建一个向量列,以列出 only 如果该物种对本研究来说是全新的,则它会生成一个数据框/ tibble 如下所示。
data.frame(species=c("Species1",new=c("TRUE","FALSE","FALSE"),3))
在这个数据框中,物种 1 是全新的,物种 2 有旧的和新的观测值,物种 3 有完全旧的观测值。因此,对于我试图创建的“新”向量,只有物种 1 是正确的。
我知道如何使用“&”和“|”基于和/或语句来改变列对于另一列中的某些级别,但如果用于创建汇总值的各个条目都没有某个级别或字符串,我不确定如何创建一个 new = TRUE 的列。我认为使用 ifelse()
语句可能是可能的,但我不确定如何编写代码来考虑 species
的每个级别。
解决方法
总结一个布尔向量,你可以sum
它的值。因为 TRUE 为 1 而 FALSE 为 0,sum(bool)
将计算向量中 TRUE 的数量。 (和 sum(!bool)
FALSE 的数量)
你可以检查一下有没有旧:
df%>%
group_by(species)%>%
summarise(new = sum( !new ) == 0)
或者有与行数一样多的新:
df%>%
group_by(species)%>%
summarise(new = sum( new ) == n())
,
仅当所有值都为 all()
时才使用 TRUE
返回 TRUE
df %>%
group_by(species) %>%
summarize(new = all(new),var = mean(var))