我有一个问题无疑会很快得到解决。我有一个主文件,其中包含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))
答案 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