如何在汇总数据框中创建仅包含新数据的列标识行?

问题描述

我有一个基于先前研究的数据集,但包含许多全新的条目。清理后的数据集包含我使用 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))