Использование map из purrr для извлечения значения, условного для другой переменной - PullRequest
0 голосов
/ 22 октября 2018

Я пытаюсь отобразить значения из нескольких фреймов данных в первичный фрейм данных.

Приведенный ниже пример работает частично, и у меня возникают проблемы в последней части

library(tidyverse)
library(purrr)
library(data.table)

# main data
eid <- c(111,333,555,777,999)
value <-c(121,135,565,400,450)
dat <- as.data.frame(cbind(eid,value),stringsAsFactors=F)

# data from mi to be mapped to main data
eid <- c(111,222,444)
date <- c(134,234,213)
mi <- as.data.frame(cbind(eid,mi.value),stringsAsFactors=F)

# data from cva to be mapped to main data
eid <- c(333,444,555,666)
date <- c(124,132,125,457)
cva <-as.data.frame(cbind(eid,cva.value),stringsAsFactors=F)

# using map to see if eid in 'mi' and 'cva' appear in main data


each.subsequent <- map(list(mi,cva),~
                     as.integer(dat$eid %in% .x$eid))
names(each.subsequent) <- c("mi","cva")
each.subsequent <- as.data.frame(each.subsequent) 

Следующий бит выполняетне работает

# maps the numerical value next to the eid
each.subsequent.value <- map(list(mi,cva),~
    ifelse (dat$eid == .x$eid, .x$date,NA))

Я нашел способ использовать правильные объединения, но это требует много написания кода.Итак, у меня было два вопроса:

1) Есть ли способ «карты» извлечения значений $ date из каждого из кадров данных mi и cva, соответствующих eid?

2) Что такоеЦель '~' и .x в коде выше, что работает?

Желаемый результат должен быть

structure(list(eid = c(111, 333, 555, 777, 999), value = c(121, 
135, 565, 400, 450), mi = c(1L, 0L, 0L, 0L, 0L), cva = c(0L, 
1L, 1L, 0L, 0L), mi.date = c(134, NA, NA, NA, NA), cva.date = c(NA, 
124, 125, NA, NA)), .Names = c("eid", "value", "mi", "cva", "mi.date", 
"cva.date"), row.names = c(NA, -5L), class = "data.frame") 

1 Ответ

0 голосов
/ 22 октября 2018

Вы можете сделать это легко с двумя left_join, если я что-то упустил (намного больше data.frames возможно):

dat %>% 
  left_join(mi, by ="eid") %>% 
  left_join(cva, by ="eid")
#   eid value mi.value cva.value
# 1 111   121      134        NA
# 2 333   135       NA       124
# 3 555   565       NA       125
# 4 777   400       NA        NA
# 5 999   450       NA        NA

Редактировать:

если у вас естьбольше data.frames использование reduce:

list(dat, mi, cva) %>% reduce(left_join, by = "eid")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...