R - 每组计算两列中的 unique/distinct 个值

R - Count unique/distinct values in two columns together per group

R - 计算两列中的 unique/distinct 个值

大家好。我有一个选举行为小组,但我在计算一个新变量时遇到问题,该变量将捕获每组 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

对于如何计算每组两列中唯一方的总数而不是每列的不同值的数量的任何建议,我将不胜感激。谢谢。

在这种情况下,我总是喜欢简化问题并将数据更改为长格式,因为如果您的所有值都在一列中,解决此类问题会更​​容易。使用 pivot_longer() 您还可以使用参数 values_drop_na = TRUE 删除示例中计算的 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 package (v2.0.1)

于 2021-08-30 创建

您可以对 cur_data() 的数据和 unlist 数据进行子集化以获得向量。使用 n_distinct 计算唯一值的数量。

library(dplyr)

df %>%
  group_by(ID) %>%
  mutate(Count = n_distinct(unlist(select(cur_data(), 
                   Party, Party2013)), na.rm = TRUE)) %>%
  ungroup


#     ID  Wave Party Party2013 Count
#  <int> <int> <chr> <chr>     <int>
#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

数据

如果您在 reproducible format

中提供数据,会更容易提供帮助
df <- structure(list(ID = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L), Wave = c(1L, 
2L, 3L, 4L, 1L, 2L, 3L, 4L), Party = c("A", "A", "B", "B", "A", 
"B", "B", "B"), Party2013 = c("A", NA, NA, NA, "C", NA, NA, NA
)), class = "data.frame", row.names = c(NA, -8L))

你也可以这样:

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 %>% 
  group_by(ID) %>%  
  mutate(Count = paste(Party, Party2013) %>% 
           unique %>% length() %>% 
           rep(length(Party)))

输出

# A tibble: 8 x 5
# Groups:   ID [2]
     ID  Wave Party Party2013 Count
  <int> <int> <chr> <chr>     <int>
1     1     1 A     A             3
2     1     2 A     NA            3
3     1     3 B     NA            3
4     1     4 B     NA            3
5     2     1 A     C             2
6     2     2 B     NA            2
7     2     3 B     NA            2
8     2     4 B     NA            2