Использование левого соединения в dpylr для сопоставления и заполнения фрейма данных R - PullRequest
0 голосов
/ 04 июня 2018

У меня есть проблема, которая, без сомнения, будет решена очень быстро.У меня есть мастер-файл, который содержит все возможные комбинации биржевых тикеров и менеджеров за 5-летний период - этот файл представлен мастерами ниже.Затем у меня есть 20 отдельных файлов, которые представляют квартальные авуары менеджера в каждой из акций (например, фрейм данных).Я хочу изменить квартальную или основную базу данных таким образом, чтобы в случае, если менеджер отбросил свое владение акциями или полностью отказался от менеджера, я назначил им значение 0, в противном случае используется фактическое значение.Таким образом, у меня будет 20 файлов с одинаковыми размерами.

Я подумал, что лучший способ сделать это - использовать left_join из dplyr.Проблема, с которой я столкнулся, заключается в том, что если я использую приведенный ниже код, новый фрейм данных x содержит только 0. Я думаю, это потому, что цифры из firsta не перезаписывают.Мы будем благодарны за любую помощь.

firsta <- data.frame(APPL = c(612,709,1000, 850, 940), 
            MSFT = c(650,790,100, 80, 910),
            IBM  = c(740,550, 222, 333, 550),
            GOOG = c(0, 1000, 500, 600, 200))

row.names(firsta) <- c("man A", "man B", "man D", "man E", "man f")

Примечание: человек С. отпал.

mastera <- data.frame(APPL = c(0,0,0,0,0,0), 
            MSFT= c(0,0,0,0,0,0),
            IBM  = c(0,0,0,0,0,0),
            GOOG = c(0,0,0,0,0,0)
            )
row.names(mastera) <- c("man A", "man B", "man C" ,"man D", "man E", "man f")

x <- mastera %>% left_join(first)

РЕДАКТИРОВАТЬ - Ожидаемый результат будет примерно таким.То есть существует третий ряд, в котором Man C равен нулю.Фрейм данных x должен состоять из 4 столбцов и 6 строк.

    x <- data.frame(APPL = c(612,709,0,1000, 850, 940), 
            MSFT = c(650,790,0,100, 80, 910),
            IBM  = c(740,550,0, 222, 333, 550),
            GOOG = c(0, 1000,0, 500, 600, 200))

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Мы можем использовать row/column индексирование в base R

mastera[row.names(firsta), colnames(firsta)] <- firsta
mastera
#      APPL MSFT IBM GOOG
#man A  612  650 740    0
#man B  709  790 550 1000
#man C    0    0   0    0
#man D 1000  100 222  500
#man E  850   80 333  600
#man f  940  910 550  200

С tidyverse мы можем gather в «длинный» формат и затем выполнить объединение

library(tidyverse)
firsta %>% 
    rownames_to_column('rn') %>%
    gather(key, val, -rn) %>% 
    right_join(mastera %>% 
                 rownames_to_column('rn') %>% 
                 gather(key, val, -rn) %>% 
                 select(-val)) %>% 
    mutate(val = replace(val, is.na(val), 0)) %>%
    spread(key, val)%>% 
    column_to_rownames('rn')
#       APPL GOOG IBM MSFT
#man A  612    0 740  650
#man B  709 1000 550  790
#man C    0    0   0    0
#man D 1000  500 222  100
#man E  850  600 333   80
#man f  940  200 550  910
0 голосов
/ 04 июня 2018
library(tidyverse)
mastera %>%
  t%>%data.frame%>%
  right_join(firsta%>%t%>%data.frame)%>%
  replace_na(list(man.C=0))%>%
  t%>%
  data.frame()%>%
  set_names(names(mastera))

     APPL MSFT IBM GOOG
man.A  612  650 740    0
man.B  709  790 550 1000
man.C    0    0   0    0
man.D 1000  100 222  500
man.E  850   80 333  600
man.f  940  910 550  200

в базе R, вы можете сделать что-то вроде:

a = t(merge(data.frame(t(mastera)),data.frame(t(firsta)),all.y=T))
a[is.na(a)] = 0
colnames(a) = names(mastera)
a
      APPL MSFT IBM GOOG
man.A    0  612 650  740
man.B 1000  709 790  550
man.D  500 1000 100  222
man.E  600  850  80  333
man.f  200  940 910  550
man.C    0    0   0    0
...