Разделите 2 столбца с 2 разных фреймов данных - PullRequest
0 голосов
/ 13 марта 2019

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

Пример:

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? Этот метод также можно использовать, когда столбцов больше, чем в текущем примере.

Ответы [ 3 ]

1 голос
/ 13 марта 2019

В базе 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, если они не нужны.

1 голос
/ 13 марта 2019

Соедините два фрейма данных вместе, а затем выполните деление и отбросьте ненужные столбцы, которые были сгенерированы при объединении (при условии, что вы хотите вычислить столбец 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
0 голосов
/ 13 марта 2019

Мы также можем использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...