Подсчет количества значений на основе подгрупп и 2 столбцов - PullRequest
0 голосов
/ 17 февраля 2019

Мне было интересно, может ли кто-нибудь помочь мне получить эти данные в R. Это довольно сложно, и я не знаю, с чего начать.Я заранее прошу прощения, если мой вопрос не ясен.Я пытаюсь создать уникальный набор данных.По сути, я пытаюсь разделить свои данные на четыре группы и посчитать, сколько раз человек получает определенное значение (я) в группе на основе значения определенного столбца.

Я смотрю данные переклички средизаконодатели и как они проголосовали.В частности, у меня есть данные панели с четырьмя переменными: id - идентификационный номер отдельного законодателя;переменная fight определяет, был ли у участника проблемы с голосованием (дихотомия); голос указывает, как проголосовал участник (он может принимать любое значение от 0 до 9, и он является категориальной переменной);и rollcall - это номер переклички или идентификатор для каждого переклички.

Сначала я бы хотел, чтобы данные были разделены на две группы.Это разделение будет основано на том, принял ли член 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 получил значение от 1 до 6 в переменной rollcall и законодатель ( id ), боролась.

B указывает группу, в которой элемент 999 получил значение от 1 до 6 в переменной rollcall , а законодатель ( id ) не боролся.

C указывает на группу, в которой элемент 999 не получил значение между 1-6 в переменной rollcall и законодателе ( id ), изо всех сил.

D указывает на группу, в которой элемент 999 не получил значение между 1-6 в переменной rollcall , а законодатель ( id ) не боролся.

Эти числовые значения в каждой группе указывают, сколько раз законодатель получал 7,8 или 9 в одной из четырех групп (A, B, C или D).Есть ли у кого-нибудь совет или потенциальный код для производства этих данных?Я ценю любую помощь, которую кто-то может оказать.Еще раз прошу прощения за этот сложный вопрос и отсутствие ясности.

1 Ответ

0 голосов
/ 17 февраля 2019

Интересный вопрос!Из того, что я понимаю, каждая группа A, B, C или D в вашем выводе будет удовлетворять двум условиям: имеет ли id = 999 Vote в 1:6 или 7:9 ивторое условие: Struggle равно YES или NO.

Для каждой группы первое условие оценивается как одинаковое.Итак, сначала мы определяем первое условие для каждой группы, а затем left_join его в исходное data, а затем summarize it.

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 из 999 составляет от 1 до 6 для каждой Rollcall группы.
  • Мы 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
...