gpt4 book ai didi

r - 在 dpylr 中使用左连接来匹配和填充数据框 R

转载 作者:行者123 更新时间:2023-12-05 06:33:31 25 4
gpt4 key购买 nike

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

我认为最好的方法是使用 dplyr 的 left_join。我遇到的问题是,如果我使用下面的代码,新数据框 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")

注意 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))

最佳答案

我们可以在 base R 中使用 row/column 索引

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,我们可以收集成“长”格式,然后进行连接

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

关于r - 在 dpylr 中使用左连接来匹配和填充数据框 R,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50687301/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com