如果某个级别的所有观察值都具有相同的值,我如何改变一列以返回一个值?

问题描述

我之前问过一个问题,关于如何使用 R (How can I create a column identifying rows consisting only of new data in a summarized data frame?) 中的 dplyr 包创建一个列,该列标识具有仅由数据框/tibble 中的新数据组成的级别的行。那里的答案非常有帮助,但是,当我去绘制数据时,我发现我处理代码的方式存在问题。具体来说,在原始数据中,有几行来自父数据集的报告数据存在错误,我通过返回原始数据记录修复了这些错误。为了记录这些,我使用原始数据表中更正后的数据创建了新行,并保留了带有标识符列 drop 的旧数据。

问题是我在汇总数据之前设置了一个过滤器来删除错误的列,因此当我尝试使用 new 函数创建 summarise 列时是不是新的,但没有用于创建汇总值的未更改观察结果作为新返回,这使得数据集看起来好像有更多全新的物种被添加到数据集中,而不是实际数量.

这是生成可重现示例的一小段代码...

df<-data.frame(species = c("Species1","Species1","Species2","Species3","Species4","Species4"),new=c(TRUE,TRUE,FALSE,FALSE),var=c(1,1,2,8,3,4,4),drop=c(FALSE,FALSE))
df2<-df%>%
  filter(drop!=TRUE)%>%
  group_by(species)%>%
  summarise(var=mean(var))

我想要生成的是如下数据集。

data.frame(species=c("Species1",new=c("TRUE","FALSE","FALSE"),4))

我尝试在 mutate 调用之前添加一个 filter 调用来尝试生成这样的列,如下面的代码所示。

df2<-df%>%
  group_by(species)%>%
  mutate(new2=(all(new)==TRUE))%>%
  filter(drop!=TRUE)%>%
  group_by(species)%>%
  summarise(var=mean(var),new=all(new2))

然而,第一个 group_by 调用函数在这种情况下似乎不起作用,我得到与上述代码相同的结果。 我试图弄清楚如果该列的所有观察值都具有相同的级别,如何为该列返回某个值。我想如果我能得到,我就可以使用上一个问题中的解决方案来生成汇总数据框的列。

我意识到这与我之前的问题存在类似的问题,但因为这是使用 summarise 创建列而不的问题,而不是如何在 { 中选择值{1}} 函数添加此新信息会使我之前的问题的答案无效,我将其作为单独的问题提交。

解决方法

我们可以使用

library(dplyr)
df %>%
    group_by(species) %>%
    mutate(new = all(new)) %>% 
    filter(!drop) %>%
    summarise(new = all(new),var = mean(var))

-输出

# A tibble: 4 x 3
#  species  new     var
#  <chr>    <lgl> <dbl>
#1 Species1 TRUE      1
#2 Species2 FALSE     2
#3 Species3 FALSE     3
#4 Species4 FALSE     4