Разделить 2 столбца из 2 разных фреймов данных

#r #dplyr

#r #dplyr

Вопрос:

Кто-нибудь знает, как разделить два столбца из двух разных фреймов данных, когда есть несколько столбцов для идентификации?

Пример:

 library(dplyr)
  name <- c('A','A', 
            'B','B')
  month = c("oct 2018", "nov 2018", 
            "oct 2018",  "nov 2018")
  var1 = c("99", "99", 
            "99",  "99")
  value <- seq(1:length(month))
  df1 = data.frame(name, month, var1, value)

  df2 = df1
  df2["var1"] = c("992", "992", "992", "992")
  df2["value"] = c(2, 4, 6, 8)

  df1

  df2
  

Вывод

 > df1
  name    month var1 value
1    A oct 2018   99     1
2    A nov 2018   99     2
3    B oct 2018   99     3
4    B nov 2018   99     4

> df2
  name    month var1 value
1    A oct 2018  992     2
2    A nov 2018  992     4
3    B oct 2018  992     6
4    B nov 2018  992     8
  

Кто-нибудь знает, как создать новый фрейм данных, который делит столбец «значение» в df2 на столбец значений df1? Метод должен быть возможен также при наличии большего количества столбцов, чем в текущем примере.

Комментарии:

1. Итак, df2$value / df1$value ?

2. Или, если вы хотите data.frame в качестве выходных данных: df2["value"] / df1["value"] Оба фрейма данных должны иметь одинаковое количество столбцов.

3. проверить?merge — что в основном является объединением, или используйте join из tidyverse … new.df <- merge(x = df1, y = df2, by = …); тогда в итоге вы получите два столбца значений

4. df3 <- merge(df1, df2, by = c("name", "month")) а затем сделать df3$value.x/df3$value.y ?

5. @RonakShah: Извините, игнорируйте мой последний вопрос. Я был немного сбит с толку. В любом случае спасибо за помощь!

Ответ №1:

В базе R мы можем сделать merge

 df3 <- merge(df1, df2, by = c("name", "month")) 
df3$value <- df3$value.x/df3$value.y
df3
#  name    month var1.x value.x var1.y value.y value
#1    A nov 2018     99       2    992       4   0.5
#2    A oct 2018     99       1    992       2   0.5
#3    B nov 2018     99       4    992       8   0.5
#4    B oct 2018     99       3    992       6   0.5
  

Вы можете удалить value.x и value.y столбец, если они не нужны.

Ответ №2:

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

 library(dplyr)
df1 %>% 
  inner_join(df2, by = c("name", "month")) %>% 
  mutate(value = value.x / value.y) %>%
  select(-value.x, -value.y)
  

предоставление:

   name    month var1.x var1.y value
1    A oct 2018     99    992   0.5
2    A nov 2018     99    992   0.5
3    B oct 2018     99    992   0.5
4    B nov 2018     99    992   0.5
  

Ответ №3:

Мы также можем использовать data.table для объединения и создания столбца «значение» путем деления столбца «значение» на соответствующий столбец в другом наборе данных при объединении on «имя» и «месяц»

 library(data.table)
df3 <- copy(df1)
setDT(df3)[df2, value := value/i.value, on = .(name, month)]
df3
#   name    month var1 value
#1:    A oct 2018   99   0.5
#2:    A nov 2018   99   0.5
#3:    B oct 2018   99   0.5
#4:    B nov 2018   99   0.5