我正试图根据另一个数据集的条件和分组来折叠数据集。我当前的数据帧看起来像这个
对于每个"国会"中的每个"RollNo",我想要一个新的变量来指示同一州的两位参议员是否一起投票(1,0(并且是否在同一政党(1,0
大会 | 州 | 投票|||||
---|---|---|---|---|---|---|
106 | Jay | 1 | 方舟 | 1代表 | ||
106 | 玛丽 | 1 | 方舟<1>Dem||||
106 | 票据 | 2 | 10 | 2 | Dem | |
106 | Kevin | 2 | 十 | 1Dem|||
108 | 起诉 | <1>矿石<2>代表|||||
108 | Sally | <1>矿石<2>代表 | ||||
108 | Lisa | 3 | SDak<1>Rep||||
108 | Penny | 3 | SDak2 | 代表|||
109 | Jay | 1 | Mich1 | Dem | ||
109 | 玛丽 | <1>密歇根州9 | 代表||||
109 | Rudy | 5 | Cal | 1 | Dem||
109 | 无 | 5 | 校准 | <1>Dem
如果希望按原样将列添加到数据帧中,请使用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))