使用group_by()根据条件在R中折叠数据集



我正试图根据另一个数据集的条件和分组来折叠数据集。我当前的数据帧看起来像这个

对于每个"国会"中的每个"RollNo",我想要一个新的变量来指示同一州的两位参议员是否一起投票(1,0(并且是否在同一政党(1,0

投票1方舟<1>Dem1Dem<1>矿石<2>代表<1>矿石<2>SDak<1>RepSDak代表Mich<1>密歇根州代表Dem<1>Dem
大会
106 Jay 1 方舟代表
106 玛丽 1
106 票据 2 10 2 Dem
106 Kevin 2
108 起诉
108 Sally代表
108 Lisa 3
108 Penny 32
109 Jay 11Dem
109 玛丽9
109 Rudy 5 Cal 1
109 5 校准

如果希望按原样将列添加到数据帧中,请使用mutate;如果希望结果每组有一行,则使用summarize。您的输出每组有一行,因此我们将使用summarize

vote == vote不会有多大用处,让我们使用n_distinct来计算不同的值。

dataframe %>% 
group_by(congress, RollNo, state) %>% 
summarize(
Pair_Vote = ifelse(n_distinct(Vote) == 1, 1, 0),
Pair_Party = ifelse(n_distinct(Party) == 1, 1, 0)
)

我们可以使用across一次修改多个列

library(dplyr)
dataframe %>%
group_by(congress, RollNo, state) %>%
summarise(across(c(Vote, Party),
~ +(n_distinct(.x) == 1), .names = "Pair_{.col}"), .groups = 'drop')

-输出

# A tibble: 6 × 5
congress RollNo state Pair_Vote Pair_Party
<int>  <int> <chr>     <int>      <int>
1      106      1 Ark           1          0
2      106      2 Ten           0          1
3      108      1 Ore           1          1
4      108      3 SDak          0          1
5      109      1 Mich          0          0
6      109      5 Cal           1          1

数据

dataframe <- structure(list(congress = c(106L, 106L, 106L, 106L, 108L, 108L, 
108L, 108L, 109L, 109L, 109L, 109L), sen = c("Jay", "Mary", "Bill", 
"Kevin", "Sue", "Sally", "Lisa", "Penny", "Jay", "Mary", "Rudy", 
"Niles"), RollNo = c(1L, 1L, 2L, 2L, 1L, 1L, 3L, 3L, 1L, 1L, 
5L, 5L), state = c("Ark", "Ark", "Ten", "Ten", "Ore", "Ore", 
"SDak", "SDak", "Mich", "Mich", "Cal", "Cal"), Vote = c(1L, 1L, 
2L, 1L, 2L, 2L, 1L, 2L, 1L, 9L, 1L, 1L), Party = c("Rep", "Dem", 
"Dem", "Dem", "Rep", "Rep", "Rep", "Rep", "Dem", "Rep", "Dem", 
"Dem")), class = "data.frame", row.names = c(NA, -12L))

最新更新