Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 我有三个数据框,具有相同的列名,但顺序不同,我需要创建一个新的数据框_R_Dataframe - Fatal编程技术网

R 我有三个数据框,具有相同的列名,但顺序不同,我需要创建一个新的数据框

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()…]将一个列与另一个列合并,但结

我有三个数据帧,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()…]将一个列与另一个列合并,但结果并不准确,

快速解决方案是重新对齐列:

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)