R 我有三个数据框,具有相同的列名,但顺序不同,我需要创建一个新的数据框
我有三个数据帧,dt1、dt2和dt3,格式如下:R 我有三个数据框,具有相同的列名,但顺序不同,我需要创建一个新的数据框,r,dataframe,R,Dataframe,我有三个数据帧,dt1、dt2和dt3,格式如下: column names : Asset A Asset B Asset C ... row names : dates 数据由0到1的值组成,尽管它们都包含相同的列名,但顺序不同 我需要创建一个具有相同列和行名称的新数据帧,但每个数据点都等于(dt1*0.5)+(dt2*0.25)+(dt3*0.25) 我不确定如何处理这个问题,因为我只处理过合并两个数据帧 我曾尝试使用mapply[intersect()…]将一个列与另一个列合并,但结
column names : Asset A Asset B Asset C ...
row names : dates
数据由0到1的值组成,尽管它们都包含相同的列名,但顺序不同
我需要创建一个具有相同列和行名称的新数据帧,但每个数据点都等于(dt1*0.5)+(dt2*0.25)+(dt3*0.25)
我不确定如何处理这个问题,因为我只处理过合并两个数据帧
我曾尝试使用mapply[intersect()…]将一个列与另一个列合并,但结果并不准确,快速解决方案是重新对齐列:
c1 <- colnames(dt1)
dt1 * 0.5 + dt2[,c1] * 0.25 + dt3[,c1] * 0.25
c1软件包
library(dplyr)
library(tibble)
df1 <- df1 %>% rownames_to_column("date") %>% mutate_if(is.numeric, funs(.*0.5))
df2 <- df2 %>% rownames_to_column("date") %>% mutate_if(is.numeric, funs(.*0.25))
df3 <- df3 %>% rownames_to_column("date") %>% mutate_if(is.numeric, funs(.*0.25))
数据
Walways提供了一个可复制的数据示例,您可以在数据片上使用dput
函数
df1 <- structure(
list(
#date = c("5/30/2019", "5/20/2019", "5/10/2019"),
asset_a = c(0, 1, 0),
asset_b = c(0.03, 0.23, 0.9),
asset_c = c(0.39, 0, 0.65),
asset_d = c(0, 0.5, 0)),
class = "data.frame",
row.names = c("5/30/2019", "5/20/2019", "5/10/2019"))
df2 <- structure(
list(#date = c("5/30/2019", "5/20/2019", "5/10/2019"),
asset_a = c(0, 0, 0.1),
asset_c = c(0.82, 0.04, 0.1),
asset_b = c(0.12, 0.9, 0),
asset_d = c(0, 0, 0)),
class = "data.frame",
row.names = c("5/30/2019", "5/20/2019", "5/10/2019"))
df3 <-structure(
list(
#date = c("5/30/2019", "5/20/2019", "5/10/2019"),
asset_a = c(0.38, 0.48, 0.49),
asset_d = c(0, 0, 0.82),
asset_c = c(0.1, 0.1, 0),
asset_b = c(0.48, 0.49, 0.79)),
class = "data.frame", row.names = c("5/30/2019", "5/20/2019", "5/10/2019"))
总结数据
full_df %>%
group_by(date) %>%
summarise_if(is.numeric, sum)
一条管道中的所有内容
如果您提供了dt1
,dt2
,。。。您可以使用dput(dt1)
,等等。当然,让我编辑一下这会更好,但不是完全可复制的…这是一个打字错误,日期都是一样的顺序,我的错误,抱歉,如果您发现答案有用,请将其标记为正确答案和/或追加投票。关于输入错误,它强调了如果您的data.frames彼此不完全一致的问题。它在.subset(x,j)中给出了错误:无效的下标类型“list”
对不起,我使用了错误的函数。答案已更新。我认为您的解决方案不适用于数据帧,而适用于矩阵。谢谢您的帮助!从现在起,我将使用dput函数,但是,我对您回答的最后一部分感到有点困惑,您说您已经总结了数据,它要么告诉我错误:列'date'未知
。现在我仍然有一个完整的9行数据框,我应该如何通过添加具有相同行名称的行来进行合并?啊,现在我看到日期是df中的行名称。要实现这一点,您只需将日期存储为变量,而不是df中的行id。我已经为您更改了代码。@Giovannipingnatelli您做了吗?很抱歉,我外出工作了,在最后一步中,将所有内容放在一个管道中时出现了一个错误:error:Column`dates`已存在于`data`中。调用`rlang::last_error()`查看回溯
我已以更清晰的方式重新发布了问题,如果您想查看:
full_df <- bind_rows(
list(df1 = df1, df2 = df2, df3 = df3),
.id = "df")
full_df %>%
group_by(date) %>%
summarise_if(is.numeric, sum)
list(df1 = df1, df2 = df2, df3 = df3) %>%
purrr::map2(.x =., .y = c(0.5, 0.25, 0.25),
~.x %>%
tibble::rownames_to_column("date") %>%
dplyr::mutate_if(is.numeric, funs(. * .y))) %>%
dplyr::bind_rows() %>%
dplyr::group_by(date) %>%
dplyr::summarise_all(sum)