#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