Словарное совпадение по строке в R - PullRequest
3 голосов
/ 20 мая 2019

У меня есть фрейм данных, в котором строковая переменная является неформальным списком элементов, которые можно разбить на символ.Я хотел бы оперировать этими элементами на основе другого набора данных.

например, задача: Рассчитать сумму элементов

df_1 <- data.frame(element=c(1:2),groups=c("A,B,C","A,D"))
df_2 <- data.frame(groups=c("A","B","C","D"), values=c(1:4))

desired <- data.frame(element=c(1:2),groups=c("A,B,C","A,D"),sum=c(6,5))

1 Ответ

2 голосов
/ 20 мая 2019

Можно было бы разделить «группы» по разделителю ,, чтобы расширить строки с помощью separate_rows, выполнить объединение с набором данных ключ / val ('df_2'), сгруппированным по элементу, получитьsum 'значений'

library(tidyverse)
df_1 %>% 
  separate_rows(groups) %>% 
  left_join(df_2) %>% 
  group_by(element) %>%
  summarise(groups = toString(groups), sum = sum(values))
# A tibble: 2 x 3
#  element groups    sum
#    <int> <chr>   <int>
#1       1 A, B, C     6
#2       2 A, D        5

Или другой вариант с base R будет использовать именованный ключ / значение vector 'nm1') для изменения значений в разделенномlist элементов, sum и назначить его новому столбцу в 'df_1'

nm1 <- setNames(df_2$values, df_2$groups)
df_1$sum <- sapply(strsplit(as.character(df_1$groups), ","), function(x) sum(nm1[x]))
...