首页 > 解决方案 > R - 每组一起计算两列中的唯一/不同值

问题描述

R - 一起计算两列中的唯一/不同值

大家好。我有一个选举行为小组,但我在计算一个新变量时遇到了问题,该变量将捕获我的两列PartyParty2013每组的唯一值(政党)。该列Party2013衡量了 2013 年选举中的投票并Party衡量了 2013 年之后的选民意图。每次我尝试n_distinctlength我分别计算两列中唯一值的数量,但不是总和。

ID  Wave  Party Party2013
1    1      A      A
1    2      A      NA
1    3      B      NA
1    4      B      NA

根据上面的示例,我通常会得到3而不是期望的2的计数。我尝试了以下命令,但只得到了单独的唯一值的数量:

data %>% group_by(ID) %>% distinct(Party, Party2013, .keep_all = TRUE) %> dplyr::summarise(Party_Party2013 = n())

或者

ddply(data, .(ID), mutate, count = length(unique(Party, Party2013))) 

预期结果如下:

ID  Wave  Party Party2013  Count
1    1      A      A         2
1    2      A      NA        2
1    3      B      NA        2
1    4      B      NA        2
2    1      A      C         3
2    2      B      NA        3
2    3      B      NA        3
2    4      B      NA        3

我非常感谢有关如何计算每组两列中唯一方的总数而不是每列不同值的数量的任何建议。谢谢。

标签: rdplyrgroup-bycountdistinct

解决方案


在这种情况下,我总是喜欢简化问题并将数据更改为长格式,因为如果您的所有值都在一个列中,则更容易解决此类问题。pivot_longer()您还可以使用示例中计算的values_drop_na = TRUEdrop参数NAs

library(tidyr)
library(dplyr)

data <- read.table(text = 
"ID  Wave  Party Party2013
1    1      A      A 
1    2      A      NA
1    3      B      NA
1    4      B      NA
2    1      A      C 
2    2      B      NA
2    3      B      NA
2    4      B      NA", header = TRUE)

data %>% pivot_longer(cols = starts_with("Party"), values_drop_na = TRUE) %>% group_by(ID) %>% 
  summarise(Count = n_distinct(value)) %>% merge(data, .)
#>   ID Wave Party Party2013 Count
#> 1  1    1     A         A     2
#> 2  1    2     A      <NA>     2
#> 3  1    3     B      <NA>     2
#> 4  1    4     B      <NA>     2
#> 5  2    1     A         C     3
#> 6  2    2     B      <NA>     3
#> 7  2    3     B      <NA>     3
#> 8  2    4     B      <NA>     3

reprex 包于 2021-08-30 创建(v2.0.1)


推荐阅读