Назначьте / объедините значение из столбца данных `C`, соответствующего той же паре значений` A` и `B`, во второй кадр данных.R - dplyr - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть два кадра данных.

  • Первый (df1) - это частотный фрейм данных цепочек смешения names1 и names2 и их frequency.
  • Второй (df2) один содержит два столбца names1 и names2, в которых содержится один или много раз или нет этих пар.И иногда в другом порядке.

Я хочу назначить частоту в новом столбце из первого дафарама df1,

df1 <- tibble(names1 = c('architecture', 'assessment', 'build'), 
              names2 = c('build', 'data', 'data'),
              frequency = c(36,13,720))

# A tibble: 3 x 3
  names1       names2 frequency
  <chr>        <chr>      <dbl>
1 architecture build         36
2 assessment   data          13
3 build        data          720

в второй кадр данных df2.

df2 <- tibble(names1 = c('architecture', 'build', 'assessment','assessment', 'business'), 
              names2 = c('build','architecture', 'data', 'data', 'strategy'))

  names1       names2        
  <chr>        <chr>         
1 architecture build         
2 build        architecture  
3 assessment   data          
4 assessment   data   
5 business     strategy         

Для этого результата:

  names1       names2        frequency
  <chr>        <chr>         <dbl>
1 architecture build         36
2 build        architecture  36
3 assessment   data          13
4 assessment   data          13
5 business     strategy      0

Примечание: иногда у меня есть df1$names1 == df2$names1 && df1$names2 == df2$names2 или df1$names1 == df2$names2 && df1$names2 == df2$names1

1 architecture build         36
2 build        architecture  36

Примечание: я хочу сохранить строки без соответствия

5 business     strategy      0

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

Рекурсивное tidyr::left_join с некоторым решением dplyr:

require(dplyr
require(tidyr) 
left_join(df2,df1,by=c("names1","names2")) %>% 
   left_join(df1,by=c(names1="names2",names2="names1")) %>% 
   mutate(frequency=coalesce(frequency.x,frequency.y,0)) %>% 
   select(-frequency.x,-frequency.y)

Это решение сохраняет порядок столбцов в df2.Строки mutate и select присутствуют потому, что left_join добавляет новые столбцы, которые необходимо объединить обратно в одночастотный столбец (и заменить NA на 0), а затем удалить.

Результат:

# A tibble: 5 x 3
  names1       names2       frequency
  <chr>        <chr>            <dbl>
1 architecture build               36
2 build        architecture        36
3 assessment   data                13
4 assessment   data                13
5 business     strategy             0
0 голосов
/ 05 декабря 2018

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

Вот решение dplyr:

library(dplyr)

df1 <- tibble(names1 = c('architecture', 'assessment', 'build'), 
              names2 = c('build', 'data', 'data'),
              frequency = c(36,13,720))

df2 <- tibble(names1 = c('architecture', 'build', 'assessment','assessment', 'business'), 
              names2 = c('build','architecture', 'data', 'data', 'strategy'))

# update df1
df1 = df1 %>% 
  rowwise() %>% 
  mutate(names = paste0(sort(c(names1, names2)), collapse = "_")) %>% 
  select(names, frequency)

# update df2
df2 = df2 %>% 
  rowwise() %>% 
  mutate(names = paste0(sort(c(names1, names2)), collapse = "_"))

# join datasets and update columns
left_join(df2, df1, by="names") %>%
  mutate(frequency = coalesce(frequency, 0)) %>%
  select(-names) %>%
  ungroup()

#   names1       names2       frequency
#   <chr>        <chr>            <dbl>
# 1 architecture build               36
# 2 build        architecture        36
# 3 assessment   data                13
# 4 assessment   data                13
# 5 business     strategy             0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...