首页 > 解决方案 > 根据子组和 2 列计算值的数量

问题描述

我想知道是否有人可以帮助我在 R 中生成这些数据。它相当复杂,我不知道如何开始。如果我的问题不清楚,我提前道歉。我正在尝试创建一个独特的数据集。本质上,我试图将我的数据分为四组,并根据某个列的值计算个人在组内收到某个值的次数。

我正在查看立​​法者之间的点名数据以及他们的投票方式。具体来说,我有四个变量的面板数据: id是个人立法者的识别号;斗争变量是成员是否有投票困难(二分法);vote表示成员如何投票(它可以取 0 到 9 之间的任何值,它是一个分类变量);和是每个点名的点名号码或 id。

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

其次,我想根据个别立法者是否努力投票(斗争)或他们没有,区分从上述步骤创建的两个组(成员 999 是否在投票变量上取任何等于 1-6 的值)争取投票。因此,我总共有四个组。

第三,根据投票变量,我想将单个立法者收到值 7、8 或 9(每四组)的总次数相加。因此,我将为每个成员有四个新变量和值

这是数据的示例。

在此处输入图像描述

这是生成该表的代码:

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")

我希望它看起来像下面这样:

在此处输入图像描述

A 表示成员 999 在点名变量中收到介于 1-6 之间的值并且立法者 ( id ) 挣扎的组。

B 表示成员 999 在点名变量中收到介于 1-6 之间的值且立法者 ( id ) 没有挣扎的组。

C 表示成员 999 未收到点名变量和立法者(id ) 挣扎的组。

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

每组中的数值表示立法者在四个组(A、B、C 或 D)之一中收到 7、8 或 9 的次数。有没有人有任何建议或潜在的代码来生成这些数据?我感谢有人可以提供的任何帮助。再次,我为这个复杂的问题和任何缺乏明确性表示歉意。

标签: rcountsubsetdata-manipulation

解决方案


有趣的问题!据我了解,您的输出中的每个组A, B, C, orD都将满足两个条件:id= 999 是否Vote1:6or7:9中,第二个条件是是否StruggleYESor 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') ))
  • 前四行表达式正在评估第一个条件(每组的 1 到 6 之间是否Vote存在。999Rollcall
  • 我们根据您的标准left_join原创并创建 4 个组。data

Output

     id     A     B     C     D
  <dbl> <int> <int> <int> <int>
1     1     1     1     1     1
2     2     1     1     2     0
3   999     0     2     1     1

推荐阅读