如果某个级别的所有观察值都具有相同的值,我如何将列突变为 returns 值?
How can I mutate a column to returns a value if all observations of a certain level have the same value?
我之前问过一个问题,关于如何使用 R 中的 dplyr
包( ).那里的答案非常有帮助,但是,当我去绘制数据时,我发现我处理代码的方式存在问题。具体来说,在原始数据中有几行来自父数据集的报告数据存在错误,我通过返回原始数据记录修复了这些错误。为了记录这些,我用原始数据表中更正的数据创建了新行,并保留了带有标识符列 drop
.
的旧数据
问题是我在总结数据之前设置了一个过滤器来删除错误的列,所以当我尝试使用 summarise
函数观察创建 new
列时,级别物种 不是 新物种,但没有用于创建汇总值的未更改观察结果被 return 编辑为新物种,这使得数据集看起来像是有更多全新物种添加到数据集中的数量比实际的要多。
这是生成可重现示例的一小段代码...
df<-data.frame(species = c("Species1","Species1","Species2","Species2","Species3","Species3","Species4","Species4"), new=c(TRUE,TRUE,TRUE,FALSE,FALSE,TRUE,FALSE,FALSE),
var=c(1,1,2,2,8,3,4,4),
drop=c(FALSE,FALSE,FALSE,FALSE,TRUE,FALSE,FALSE,FALSE))
df2<-df%>%
filter(drop!=TRUE)%>%
group_by(species)%>%
summarise(var=mean(var))
我要生成的数据集如下所示。
data.frame(species=c("Species1","Species2","Species3","Species4"),
new=c("TRUE","FALSE","FALSE","FALSE"),
var=c(1,2,3,4))
我尝试在 filter
调用之前添加一个 mutate
调用以尝试生成这样的列,如下面的代码所示。
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
调用函数在这种情况下似乎不起作用,我得到与上述代码相同的结果。 我想弄清楚如何 return 如果某列的所有观察值都具有相同的水平 ,则该列的特定值。我想如果我能得到它,我就可以使用上一个问题中的解决方案来生成汇总数据框的列。
我意识到这与我之前的问题类似,但因为这是使用 summarise
创建列 without 而不是如何创建的问题select 函数中的 summarise
值并添加此新信息会使我之前问题的答案无效,我将其作为单独的问题提交。
我们可以使用
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
我之前问过一个问题,关于如何使用 R 中的 dplyr
包(drop
.
问题是我在总结数据之前设置了一个过滤器来删除错误的列,所以当我尝试使用 summarise
函数观察创建 new
列时,级别物种 不是 新物种,但没有用于创建汇总值的未更改观察结果被 return 编辑为新物种,这使得数据集看起来像是有更多全新物种添加到数据集中的数量比实际的要多。
这是生成可重现示例的一小段代码...
df<-data.frame(species = c("Species1","Species1","Species2","Species2","Species3","Species3","Species4","Species4"), new=c(TRUE,TRUE,TRUE,FALSE,FALSE,TRUE,FALSE,FALSE),
var=c(1,1,2,2,8,3,4,4),
drop=c(FALSE,FALSE,FALSE,FALSE,TRUE,FALSE,FALSE,FALSE))
df2<-df%>%
filter(drop!=TRUE)%>%
group_by(species)%>%
summarise(var=mean(var))
我要生成的数据集如下所示。
data.frame(species=c("Species1","Species2","Species3","Species4"),
new=c("TRUE","FALSE","FALSE","FALSE"),
var=c(1,2,3,4))
我尝试在 filter
调用之前添加一个 mutate
调用以尝试生成这样的列,如下面的代码所示。
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
调用函数在这种情况下似乎不起作用,我得到与上述代码相同的结果。 我想弄清楚如何 return 如果某列的所有观察值都具有相同的水平 ,则该列的特定值。我想如果我能得到它,我就可以使用上一个问题中的解决方案来生成汇总数据框的列。
我意识到这与我之前的问题类似,但因为这是使用 summarise
创建列 without 而不是如何创建的问题select 函数中的 summarise
值并添加此新信息会使我之前问题的答案无效,我将其作为单独的问题提交。
我们可以使用
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