【问题标题】:How to construct a data frame with the information from other two dataframes如何使用来自其他两个数据框的信息构建数据框
【发布时间】:2020-11-12 17:37:37
【问题描述】:

我有两个数据框,第一个有大约 700,000 行,第二个有 3000 行。

第一个看起来像这样:

Date    time       20  30  10        
201512         1 -142 406 406 
201512         2 -554 376 841 
201512         3 -378 652 692
201512         4 -841 117 707 
201512         5 -187 159 338 
201512         6 -637 364 362 

第二个:

t X20.202009   X30.202009  X10.202009 X20.201512   X30.201512
1 0.001234288 -0.008524849 0.04354567 0.001095770 -0.003047575
2 0.001579689 -0.008521823 0.04357056 0.001297871 -0.003047184
3 0.001925088 -0.007832549 0.04349185 0.001499973 -0.003046793
4 0.002270496 -0.006745983 0.04372217 0.001702075 -0.002563976
5 0.002615893 -0.005659420 0.04362848 0.001904166 -0.001801842

我尝试合并两个数据框,但由于两个矩阵的长度,我无法合并。 我想根据 t、日期和(A、B 或 C)在第一个数据框中添加三列,在第二个数据框中添加相应的数字。

【问题讨论】:

  • 第二个数据框“B - 2012512”中的 2012512 是拼写错误吗?它有七位数而不是六位数。
  • @LC-datascientist 你能帮我解决我所做的更改吗?
  • 请参阅下面的更新答案。它有想要的输出吗?我不确定合并方法(left_join())是否是您正在考虑的方法。您也可以尝试其他合并选项,例如 full_join()inner_join() 或基本的 merge()。 (阅读他们的文档以了解他们是如何加入的。)
  • 是的,输出是所需的。我会读的,谢谢

标签: r dataframe merge


【解决方案1】:

这是您的数据框:

df1 <- structure(list(Date = c(201512L, 201512L, 201512L, 201512L, 201512L, 
201512L), time = 1:6, `20` = c(-142L, -554L, -378L, -841L, -187L, 
-637L), `30` = c(406L, 376L, 652L, 117L, 159L, 364L), `10` = c(406L, 
841L, 692L, 707L, 338L, 362L)), class = "data.frame", row.names = c(NA, 
-6L))

df2 <- structure(list(t = 1:5, X20.202009 = c(0.001234288, 0.001579689, 
0.001925088, 0.002270496, 0.002615893), X30.202009 = c(-0.008524849, 
-0.008521823, -0.007832549, -0.006745983, -0.00565942), X10.202009 = c(0.04354567, 
0.04357056, 0.04349185, 0.04372217, 0.04362848), X20.201512 = c(0.00109577, 
0.001297871, 0.001499973, 0.001702075, 0.001904166), X30.201512 = c(-0.003047575, 
-0.003047184, -0.003046793, -0.002563976, -0.001801842)), row.names = c(NA, 
-5L), class = "data.frame")

第 1 步。 重新格式化 df2 以使列 t(重命名为时间)、日期和值分布在重新组织的数据列中:

library(dplyr)
library(tidyr)

df2_reformat <- df2 %>% 
    rename(time = t) %>% 
    pivot_longer(contains("."), names_to = c("group", "Date"), names_sep = "\\.") %>% 
    pivot_wider(names_from = group, values_from = value) %>% 
    mutate(Date = as.integer(Date))

head(df2_reformat)
## A tibble: 6 x 5
#   time   Date     X20      X30     X10
#  <int>  <int>   <dbl>    <dbl>   <dbl>
#1     1 202009 0.00123 -0.00852  0.0435
#2     1 201512 0.00110 -0.00305 NA     
#3     2 202009 0.00158 -0.00852  0.0436
#4     2 201512 0.00130 -0.00305 NA     
#5     3 202009 0.00193 -0.00783  0.0435
#6     3 201512 0.00150 -0.00305 NA    

第 2 步。 通过向 df1 添加新列来合并 df1df2_reformat

df_final <- left_join(df1, df2_reformat)
#Joining, by = c("Date", "time")

df_final
#    Date time   20  30  10         X20          X30 X10
#1 201512    1 -142 406 406 0.001095770 -0.003047575  NA
#2 201512    2 -554 376 841 0.001297871 -0.003047184  NA
#3 201512    3 -378 652 692 0.001499973 -0.003046793  NA
#4 201512    4 -841 117 707 0.001702075 -0.002563976  NA
#5 201512    5 -187 159 338 0.001904166 -0.001801842  NA
#6 201512    6 -637 364 362          NA           NA  NA

【讨论】:

    猜你喜欢
    • 2019-04-20
    • 2020-01-20
    • 2019-11-02
    • 1970-01-01
    • 2020-12-27
    • 1970-01-01
    • 2023-04-08
    • 2016-09-11
    • 2020-11-22
    相关资源
    最近更新 更多