根据子组和2列计算值的数量

时间:2019-02-17 00:09:53

标签: r count subset data-manipulation

我想知道是否有人可以帮助我在R中生成此数据。它相当复杂,我不确定如何开始。如果我的问题不清楚,我预先表示歉意。我正在尝试创建一个唯一的数据集。本质上,我试图将我的数据分为四个组,并根据某个列的值计算一个人在一个组中获得某个特定值的次数。

我正在研究立法者之间的点名数据以及他们如何投票。具体来说,我拥有包含四个变量的面板数据: id 是个人立法者的标识号; struggle 变量是成员是否投票困难(二分法); vote 指示成员如何投票(它可以采用0到9之间的任何值,并且是一个类别变量); rollcall 是点名电话或每个点名的ID。

首先,我想将数据分为两组。这种分离将基于成员999( id )的表决列是否具有等于1到6的任何值。如果他这样做,我希望所有唱名表决的人(和成员)分开在一个类别中。对于所有剩余的唱名投票(或不等于1到6),我希望将所有唱名投票(和成员)放在一个单独的组中。

第二,我想通过单个立法者是否努力投票来分离从上述步骤创建的两个组(成员999是否在表决变量中采用等于1-6的任何值)? ),否则他们就不会投票。这样,我总共将有四个小组。

第三,基于表决变量,我想累加一个单独的立法者收到值7、8或9(每四个组)的总次数。因此,我将为每个成员添加四个新变量和值

下面是数据示例。

enter image description here

以下是生成该表的代码:

id=c(999,1,2, 999,1,2,999,1,2,999,1,2)
Struggle=c("NO", "YES", "NO", "NO", "NO", "YES", "NO", "NO", "YES", "YES", "YES", "YES")
Vote=c(1,9,1,9,0,1,2,9,9,9,9,1)
Rollcall=c(1,1,1,2,2,2,3,3,3,4,4,4)
data=cbind("id", "Struggle", "Vote", "Rollcall")

我希望它看起来像这样:

enter image description here

A表示成员999收到 rollcall 变量中的1-6之间的值并且立法者( id )努力的群体。

B表示成员999在 rollcall 变量中接收的1-6之间的值且立法者( id )没有苦苦挣扎的组。

C表示其中成员999没有收到 rollcall 变量中1-6之间的值且立法者( id )苦苦挣扎的组。

D表示其中成员999没有收到 rollcall 变量中1-6之间的值并且立法者( id )没有遇到困难的组。

每组中的数字值表示立法者在四个组(A,B,C或D)之一中获得7、8或9的次数。 有没有人有任何建议或潜在的代码来生成此数据?我很感谢有人可以提供的任何帮助。再次,对于这个复杂的问题以及任何不明确之处,我深表歉意。

1 个答案:

答案 0 :(得分:1)

有趣的问题!据我了解,输出中的每个组ABCD都将满足两个条件:id = 999是否具有{{ 1}}在Vote1:6中,第二个条件是7:9Struggle还是YES

对于每个组,第一个条件的评估结果相同。因此,我们首先确定每个组的第一个条件,然后将其NO设置为原始left_join,然后data

summarize
  • 表达式的前四行正在评估第一个条件(对于每个library(tidyverse) data <- data.frame(id, Struggle, Vote, Rollcall) data %>% filter(id==999) %>% mutate(cond = ifelse(Vote %in% 1:6, TRUE, FALSE)) %>% select(Rollcall, cond) %>% left_join(data, by='Rollcall') %>% group_by(id) %>% summarize(A = sum( (cond == TRUE) & (Struggle == 'YES') ), B = sum( (cond == TRUE) & (Struggle == 'NO') ), C = sum( (cond == FALSE) & (Struggle == 'YES') ), D = sum( (cond == FALSE) & (Struggle == 'NO') )) 组,Vote的{​​{1}}是否在1到6之间。
  • 我们999Rollcall的原始版本,并根据您的条件创建4个组。

left_join

data
相关问题