在dpylr中使用左连接来匹配和填充数据帧R.

时间:2018-06-04 19:12:02

标签: r dplyr left-join

我有一个问题无疑会很快得到解决。我有一个主文件,其中包含5年期间所有可能的股票代码和经理组合 - 此文件由下面的mastera表示。然后,我有20个单独的文件,代表每个股票中经理的季度持股(例如数据框第一)。我想修改季度或主数据框,这样如果经理已经放弃了他们在股票中的持股,或者经理完全下跌,我将为他们分配值0,否则使用实际值。这样我将拥有20个具有一致尺寸的文件。

我认为最好的方法是使用dplyr中的left_join。我的问题是,如果我使用下面的代码,新的数据框x只包含0.我想这是因为来自第一个的数字不会覆盖。任何帮助将不胜感激。

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")

NB男子C已经下降。

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 :(得分:0)

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

答案 1 :(得分:0)

我们可以在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进入&#39; long&#39;格式,然后进行连接

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