У меня есть данные, аналогичные приведенным ниже, которые представляют взаимодействия между сущностями.
> 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.
Спасибо!