【问题标题】:Merge and fill different length data in R在R中合并和填充不同长度的数据
【发布时间】:2018-02-17 19:22:34
【问题描述】:

我正在使用 R 并且需要合并不同长度的数据

关注这个数据集

> means2012
 # A tibble: 232 x 2
   exporter    eci
   <fct>     <dbl>
 1 ABW       0.235
 2 AFG      -0.850
 3 AGO      -1.40 
 4 AIA       1.34 
 5 ALB      -0.480
 6 AND       1.22 
 7 ANS       0.662
 8 ARE       0.289
 9 ARG       0.176
 10 ARM       0.490
 # ... with 222 more rows

> means2013
 # A tibble: 234 x 2
    exporter     eci
    <fct>      <dbl>
  1 ABW       0.534 
  2 AFG      -0.834 
  3 AGO      -1.26  
  4 AIA       1.47  
  5 ALB      -0.498 
  6 AND       1.13  
  7 ANS       0.616 
  8 ARE       0.267 
  9 ARG       0.127 
 10 ARM       0.0616
 # ... with 224 more rows


> str(means2012)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame':   232 obs. of  2 variables:
 $ exporter: Factor w/ 242 levels "ABW","AFG","AGO",..: 1 2 3 4 5 6 7 9 10 11 ...
 $ eci     : num  0.235 -0.85 -1.404 1.337 -0.48 ...
> str(means2013)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame':   234 obs. of  2 variables:
 $ exporter: Factor w/ 242 levels "ABW","AFG","AGO",..: 1 2 3 4 5 6 7 9 10 11 ...
 $ eci     : num  0.534 -0.834 -1.263 1.471 -0.498 ...

请注意,2 个 tibble 具有不同的长度。 “出口国”是国家。

有什么方法可以合并两个小标题,查看因素(Exporter)并用“na”填充缺失的部分?

不管是 tibble、dataframe 还是其他类型。

像这样:

tibble 1
a 5
b 10
c 15
d 25

tibble 2
a 7
c 23
d 20

merged one:
a 5  7 
b 10 na
c 15 23
d 25 20

【问题讨论】:

  • left_join 会有所帮助。
  • MKR,使用其他 dplyr 解决方案得到了同样的错误:错误:by 必须是(命名的)字符向量、列表或 NULL 用于自然连接(不推荐在生产代码中使用) , 不列出
  • 您应该提供by = exporter。如果您想包含两个小标题中的缺失值,您可能应该使用full_join

标签: r dataframe factors tibble data-transform


【解决方案1】:

使用merge 并将参数all 设置为TRUE

tibble1 <- read.table(text="
x y
a 5
b 10
c 15
d 25",header=TRUE,stringsAsFactors=FALSE)

tibble2 <- read.table(text="
x z
a 7
c 23
d 20",header=TRUE,stringsAsFactors=FALSE)


merge(tibble1,tibble2,all=TRUE)

  x  y  z
1 a  5  7
2 b 10 NA
3 c 15 23
4 d 25 20

dplyr::full_join(tibble1,tibble2) 效果相同

【讨论】:

  • 返回的第一个选项:fix.by(by.x, x) 中的错误:'by' 必须将一个或多个列指定为数字、名称或逻辑。第二个返回 "Error: by must be a (named) character vector, list, or NULL for natural joins (not recommended in production code), not list"
  • 使用我回答中的数据?
  • 不,使用我的数据。
  • 如果解决方案适用于您的可重现示例但不适用于您的真实数据,您应该更新您的可重现示例以反映问题。
  • 发现错误。合并工作完美。这里的简单错误是试图同时合并超过 2 个 tibble。在一个循环中执行它,2 x 2 效果很好。谢谢穆迪
【解决方案2】:

您可以重命名列以加入它们,并在缺少其他值的地方获得 NA

library(tidyverse)

means2012 %>% 
  rename(eci2012 = eci) %>% 
  full_join(means2013 %>% 
              rename(eci2013 = eci))

但更简洁的方法是添加一个year 列,保持eci 列不变,然后将行绑定在一起。

means2012 %>% 
  mutate(year = 2012) %>% 
  bind_rows(means2013 %>% 
              mutate(year = 2013))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-04
    • 1970-01-01
    • 2014-08-13
    • 2012-12-15
    • 2021-05-27
    • 2018-06-13
    相关资源
    最近更新 更多