【问题标题】:Count Number of Values Based on Subgroups and 2 Columns根据子组和 2 列计算值的数量
【发布时间】:2019-02-17 00:09:53
【问题描述】:

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

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

首先,我希望将数据分成两组。这种分离将基于成员 999 (id) 是否为投票列取了任何等于 1 到 6 的值。如果他这样做了,我希望将所有这些唱名投票(和成员)分开在一个类别中。对于所有剩余的唱名投票(或不等于 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 在 rollcall 变量中收到介于 1-6 之间的值并且立法者 (id) 挣扎的组。

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

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

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

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

【问题讨论】:

    标签: r count subset data-manipulation


    【解决方案1】:

    有趣的问题!据我了解,您的输出中的每个组ABCD 都将满足两个条件:id = 999 在1:67:9 中是否有Vote 和第二个条件是StruggleYES还是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') ))
    
    • 前四行表达式正在评估第一个条件(对于每个 Rollcall 组,999Vote 是否介于 1 和 6 之间。
    • 我们将left_join 改成原来的data 并根据您的标准创建 4 个组。

    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
    

    【讨论】:

    • 感谢您的帮助!我认为代码非常接近,但它产生了属于每个类别(针对成员)的唱名投票总数。我有兴趣知道有多少成员的唱名投票包含 7、8 或 9 的投票值(在 4 个唱名类别中的每一个类别中)。你对如何做这最后一部分有什么建议吗?再次感谢您,这真的很接近。
    • 迪伦,我不确定我是否理解。在我看来,对于成员 (ids) 1 和 2:根本不考虑他们各自的 Vote 值,因为初始(步骤 1)排序的标准是 Vote 值 @987654346 @ = 999。如果您想知道每个成员有多少唱名投票(考虑到他们自己的Vote 值),那么输出表的分布会有所不同。你能澄清一下吗?
    • 我想通了。我有一个编码错误!谢谢!
    猜你喜欢
    • 2017-08-11
    • 2022-12-06
    • 2019-05-19
    • 2017-09-13
    • 1970-01-01
    • 1970-01-01
    • 2022-12-10
    • 2016-12-05
    • 1970-01-01
    相关资源
    最近更新 更多