从数据框中提取(或隔离)“分组常量”列,*使用 dplyr/tidyverse*

问题描述 投票:0回答:3

如何从数据框中提取(或隔离_分组常量列,使用 dplyr/tidyverse

这是 Dowle/Hadley 几十年前的问题的更新这里。早期海报的示例...

使用 iris 中的一个人为示例(生成一个数据集,其中的列在本示例中按组保持不变)

irisX <- iris %>% mutate(
    numspec = as.numeric(Species),
    numspec2 = numspec*2
)

现在我想生成一个仅保留列

Species
numspec
numspec2
的数据集(并且每列仅保留一行)。

我不想告诉它这些是哪些列(按组常量)——我希望它为我找到这些列。

所以我想要的是

Species, numspec, numspec2
setosa, 1, 2
versicolor, 2, 4
virginica, 3, 6

与旧的链接问题不同,我想使用 tidyverse 做一些事情,这样我可以更好地理解它并且代码看起来更干净。

我尝试过类似的事情

single_iris <- irisX %>% 
group_by(Species) %>% 
select_if(function(.) n_distinct(.) == 1)

但是后者

select_if
忽略了分组。

r dplyr duplicates
3个回答
1
投票

如果我们想使用

select
,请在分组之外进行

library(dplyr)
irisX %>%
     select(where(~ n_distinct(.) == n_distinct(irisX$Species))) %>%     
     distinct() 

0
投票

你可以这样做:

iris %>% 
  group_by(Species)%>%
  summarise(numspec = as.numeric(first(Species)),
            numspec2 = numspec*2)

0
投票

这个怎么样?

library(dplyr)
irisX %>% 
group_by(Species) %>%
summarise(across(everything(), n_distinct)) %>% 
select_if(function(.) n_distinct(.) == 1)

输出:

   A tibble: 3 × 2
   numspec numspec2
     <int>    <int>
 1       1        1
 2       1        1
 3       1        1

您还可以将列名称提取为向量并用于其他“整齐选择”目的。

© www.soinside.com 2019 - 2024. All rights reserved.