пытаясь сгруппировать, возвращая указанное значение и суммируя строки с другим значением в R - PullRequest
1 голос
/ 18 марта 2020

Думаю, у меня правильная идея, но я мог бы помочь. У меня есть что-то похожее ниже, где я пытаюсь найти числитель и знаменатель вхождений для ID3.

У меня есть все, кроме want, den и num.

want - это ID процентов, основанных на том, когда ID2 == 0 на group.

num - это числитель вхождений, где val == 1 для данного ID3 от want (например, ID3 == 1 связан с F, а B связан с val == 1, поэтому числитель для ID3 == 1 равен 1, а знаменатель равен 2), а den является знаменателем вхождений для данного ID3.

Я думаю, что могу решить den, используя UniqueN из want по ID3, но не знаю, как получить num.

Пожалуйста, помогите мне решить, хотите, ден и номер!


df<-data.frame(ID=c('A', 'B', 'A', 'C', 'C', 'D', 'E', 'F'),
               ID2=c(1, 0, 1, 1, 1, 0, 1, 0),
               ID3=c(1,2,3,4,5,6,1,2),
               group=c(1,1,1,2,2,2, 3, 3),
               val=c(1,1,1,0,0,0,0,0),
               want=c('B','B','B','D', 'D', 'D', 'F', 'F'),
               den=c(2,2,1,1,1,1,2,2),
               num=c(1,1,0,0,0,0,1,1))

df

  ID ID2 ID3 group val want den num
1  A   1   1     1   1    B   2   1
2  B   0   2     1   1    B   2   1
3  A   1   3     1   1    B   1   0
4  C   1   4     2   0    D   1   0
5  C   1   5     2   0    D   1   0
6  D   0   6     2   0    D   1   0
7  E   1   1     3   0    F   2   1
8  F   0   2     3   0    F   2   1

1 Ответ

1 голос
/ 18 марта 2020

Мы можем сделать сравнение для подстановки значений после группировки по

library(dplyr)
df %>% 
     group_by(group) %>% 
     mutate(want = ID[ID2==0]) %>%
     group_by(ID3) %>%
     mutate(num = +(n_distinct(want) > 1 & any(val == 1)), den = n())
# A tibble: 8 x 8
# Groups:   ID3 [6]
#  ID      ID2   ID3 group   val want    den   num
#  <fct> <dbl> <dbl> <dbl> <dbl> <fct> <int> <int>
#1 A         1     1     1     1 B         2     1
#2 B         0     2     1     1 B         2     1
#3 A         1     3     1     1 B         1     0
#4 C         1     4     2     0 D         1     0
#5 C         1     5     2     0 D         1     0
#6 D         0     6     2     0 D         1     0
#7 E         1     1     3     0 F         2     1
#8 F         0     2     3     0 F         2     1

или другой вариант match

df %>% 
      group_by(group) %>%
      mutate(want = ID[match(0, ID2)])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...