【问题标题】:Match and merge two data frames匹配并合并两个数据框
【发布时间】:2018-11-07 03:22:24
【问题描述】:

我想合并和匹配以下 CSV 文件。

CSV 1

Year    Qrtrs   BD  BS  BY  All
1950    JAS     0   1   0   1
1950    OND     0   2   1   3
1951    JAS     1   0   4   5

CSV 2

Year    JFM AMJ JAS OND
1950    LN  LN  NN  LN
1951    LN  NN  EN  EN

并且想得到ff。

Year    Qrtrs   CASE    BD  BS  BY  All
1950    JAS       NN    0   1   0   1
1950    OND       LN    0   2   1   3
1951    JAS       EN    1   0   4   5

我是 R 新手。感谢您的帮助。

另外,我想在最终的 CSV 中添加剩余的 Qrtrs,并在 BD、BS、BY、ALL 中添加“0”。请参见下文。

Year    Qrtrs   CASE    BD  BS  BY  All
1950    JAS       NN    0   1   0   1
1950    OND       LN    0   2   1   3
1950    AMJ       LN    0   0   0   0
1950    JFM       LN    0   0   0   0

谢谢!

【问题讨论】:

标签: r


【解决方案1】:

数据

df1 <- read.table(
  text = "Year    Qrtrs   BD  BS  BY  All
          1950    JAS     0   1   0   1
          1950    OND     0   2   1   3
          1951    JAS     1   0   4   5",
  header = T, stringsAsFactors = F
)

df2 <- read.table(
  text = "Year    JFM AMJ JAS OND
          1950    LN  LN  NN  LN
          1951    LN  NN  EN  EN",
  header = T, stringsAsFactors = F
)

我提供了一个带有gather{tidyr} 和left_join{dplyr} 的方法:

library(tidyr)
library(dplyr)

df2.2 <- gather(df2, key = "Qrtrs", value = "CASE", - Year)

df2.2

#   Year Qrtrs CASE
# 1 1950   JFM   LN
# 2 1951   JFM   LN
# 3 1950   AMJ   LN
# 4 1951   AMJ   NN
# 5 1950   JAS   NN
# 6 1951   JAS   EN
# 7 1950   OND   LN
# 8 1951   OND   EN

left_join(df1, df2.2)

#   Year Qrtrs BD BS BY All CASE
# 1 1950   JAS  0  1  0   1   NN
# 2 1950   OND  0  2  1   3   LN
# 3 1951   JAS  1  0  4   5   EN

另外,这是一个基本的方式:

df2.stack <- stack(df2, select = -Year)
df2.2 <- cbind(df2$Year, df2.stack)
names(df2.2) <- c("Year", "CASE", "Qrtrs")
merge(df1, df2.2, by = c("Year", "Qrtrs"))

【讨论】:

    猜你喜欢
    • 2021-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-27
    • 2017-08-15
    • 2017-05-23
    • 2020-08-12
    • 1970-01-01
    相关资源
    最近更新 更多