Как я могу добавить конкретные данные из одного кадра данных в другой более крупный кадр данных? - PullRequest
2 голосов
/ 04 октября 2019

У меня есть два кадра данных;df1 - для бейсбольных матчей, df2 - данные о погоде (дожде) по стадионам.

df1
date         Stadium
2019-01-01   Yankee
2019-01-01   Dodger
2019-01-01   Coors
2019-01-02   Dodger
...
df2
date             Yankee     Dodger     Coors
2019-01-01       0          0.1        0.1
2019-01-02       0          0          0
2019-01-03       0          0.2        0.1
...

Я хотел бы добавить столбец df1$rain в df1, используя соответствующие данныеот df2. Я попытался объединить два фрейма данных, но он возвращает избыточные и длинные данные со слишком большим количеством столбцов.

Ответы [ 2 ]

2 голосов
/ 04 октября 2019

Используя data.table:

library(data.table)

melt(setDT(df2), id.vars = 'date', 
                 variable.name = "Stadium", 
                 value.name = "rain")[setDT(df1), on = .(date, Stadium)]

Другое решение tidyverse, используя tidyr::gather:

library(dplyr)
library(tidyr)

df2 %>% 
  gather(Stadium, rain, -date) %>% 
  right_join(df1)

Данные:

df1 <- read.table(text="
date         Stadium
2019-01-01   Yankee
2019-01-01   Dodger
2019-01-01   Coors
2019-01-02   Dodger", 
                  header=T, stringsAsFactors=F)

df2 <- read.table(text="
date             Yankee     Dodger     Coors
2019-01-01       0          0.1        0.1
2019-01-02       0          0          0
2019-01-03       0          0.2        0.1", 
                  header=T, stringsAsFactors=F)
2 голосов
/ 04 октября 2019

Один параметр - match из base R, чтобы получить индекс row/column, используйте его для извлечения значений из второго набора данных, чтобы создать столбец «дождь» в первом наборе данных

df1$rain <-  df2[-1][cbind(match(df1$date, df2$date), 
                           match(df1$Stadium, names(df2)[-1]))]

Или другой вариант - преобразовать второй набор данных в «длинный» формат и затем выполнить объединение

library(dplyr)
library(tidyr)
df2 %>% 
   pivot_longer(cols = -date, names_to = 'Stadium', values_to = 'rain') %>%
   right_join(df1)
# A tibble: 4 x 3
#  date       Stadium  rain
#  <chr>      <chr>   <dbl>
#1 2019-01-01 Yankee    0  
#2 2019-01-01 Dodger    0.1
#3 2019-01-01 Coors     0.1
#4 2019-01-02 Dodger    0  

data

df1 <- structure(list(date = c("2019-01-01", "2019-01-01", "2019-01-01", 
"2019-01-02"), Stadium = c("Yankee", "Dodger", "Coors", "Dodger"
)), class = "data.frame", row.names = c(NA, -4L))

df2 <- structure(list(date = c("2019-01-01", "2019-01-02", "2019-01-03"
), Yankee = c(0L, 0L, 0L), Dodger = c(0.1, 0, 0.2), Coors = c(0.1, 
0, 0.1)), class = "data.frame", row.names = c(NA, -3L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...