Ссылка на конкретное значение в группе dplyr в каждом конкретном случае - PullRequest
0 голосов
/ 21 октября 2018

У меня есть данные, аналогичные приведенным ниже, которые представляют взаимодействия между сущностями.

> library(tidyverse)
> set.seed(20)
> dta <- data_frame(group=c(1,1,2,2,2,3,3,3),
           flag=c(1,0,1,0,0,0,1,1),
           name=c('a','b','a','c','d','b','c','c'),
           amount=rnorm(8,20))
# A tibble: 8 x 4
  group  flag name  amount
  <dbl> <dbl> <chr>  <dbl>
1     1     1  a      21.2
2     1     0  b      19.4
3     2     1  a      21.8
4     2     1  c      18.7
5     2     0  d      19.6
6     3     0  b      20.6
7     3     1  c      17.1
8     3     1  c      19.1

Могут быть отношения один-к-одному, отправка одного объекта многим другим или получение множества объектов от одного.Столбец группы обозначает взаимодействие, а флаг обозначает отправку / получение (не имеет значения, что происходит).

Для сетевого анализа мне нужно group_by столбец группы, а затем создать столбец с именем "to, который содержит значение «name» из строки в группе, где flag - это единственные 1 или 0 в своей группе.В случае взаимодействия один-к-одному я присваиваю имя из строки с помощью flag == 1.

. Мне нужно что-то вроде этого:

dta %>%
  group_by(group) %>%
  mutate(to = case_when(sum(.$flag) == 1 ~ .$name[.$flag == 1],
                        sum(.$flag == 0) == 1 ~ .$name[.$flag == 0],
                        TRUE ~ .$name[.$flag == 1]))

  group  flag name  amount  to
  <dbl> <dbl> <chr>  <dbl> <chr>
1     1     1  a      21.2  a
2     1     0  b      19.4  a
3     2     1  a      21.8  d
4     2     1  c      18.7  d
5     2     0  d      19.6  d
6     3     0  b      20.6  b
7     3     1  c      17.1  b
8     3     1  c      19.1  b

Использование mutate,.$ относится ко всему tbl вместо группы.Я уверен, что это можно сделать с помощью do, но я не очень знаком с его использованием, и это дает мне нежелательную структуру, когда я заменяю приведенный выше вызов mutate.

Спасибо!

1 Ответ

0 голосов
/ 21 октября 2018

Мы можем создать столбец частоты, чтобы сделать это

library(dplyr)
dta %>% 
   group_by(group, flag) %>% 
   mutate(n = n()) %>%
   group_by(group) %>%
   mutate(to = name[which(n ==1)[1]]) %>% 
   select(-n)
# A tibble: 8 x 5
# Groups:   group [3]
#  group  flag name  amount to   
#  <dbl> <dbl> <chr>  <dbl> <chr>
#1     1     1 a       21.2 a    
#2     1     0 b       19.4 a    
#3     2     1 a       21.8 d    
#4     2     1 c       18.7 d    
#5     2     0 d       19.6 d    
#6     3     0 b       20.6 b    
#7     3     1 c       17.1 b    
#8     3     1 c       19.1 b    

Или вместо группировки по 'group' и 'flag', примените table, чтобы получить частоту 'flag'и извлеките name, который соответствует частоте 1

dta %>% 
    group_by(group) %>%
    mutate(to = name[which(table(factor(flag, 
             levels = 0:1))[as.character(flag)] == 1)])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...