问题描述
我之前问过一个问题,关于如何使用 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