【问题标题】:keep a column when expanding dataframe to fill using tidyr::complete使用 tidyr::complete 扩展数据框以填充时保留一列
【发布时间】:2019-04-18 21:30:09
【问题描述】:

关于如何填充数据框中缺失的行,我使用了这个例子

df <- read.table(textConnection("car,year,month,country,amount
    Mazda,2012,02,JP,2344
    Ford,2012,04,US,235234
    Mazda,2012,03,JP,3455
    Mazda,2012,04,JP,43554
    Mazda,2012,05,JP,9854
    Mazda,2012,06,JP,32556
    Ford, 2013,01,US,345"), sep = ",", header = TRUE)

> df
                                       car year month country amount
1                                    Mazda 2012     2      JP   2344
2                                     Ford 2012     4      US 235234
3                                    Mazda 2012     3      JP   3455
4                                    Mazda 2012     4      JP  43554
5                                    Mazda 2012     5      JP   9854
6                                    Mazda 2012     6      JP  32556
7                                     Ford 2013     1      US    345

我使用 tidyr::complete 以这种方式填充月份和年份的缺失行:

tidyr::complete(df, car = unique(car), year = 2012:2014, month=1:12, fill=list(amount=0))

但是国家丢失了。我已经阅读了 tidyr 文档,但它真的很短,找不到任何其他 SO 答案。

# A tibble: 108 x 5
   car                                        year month country amount
   <fct>                                     <int> <int> <fct>    <dbl>
 1 "                                   Ford"  2012     1 NA           0
 2 "                                   Ford"  2012     2 NA           0
 3 "                                   Ford"  2012     3 NA           0
 4 "                                   Ford"  2012     4 US      235234
 5 "                                   Ford"  2012     5 NA           0
 6 "                                   Ford"  2012     6 NA           0
 7 "                                   Ford"  2012     7 NA           0
 8 "                                   Ford"  2012     8 NA           0
 9 "                                   Ford"  2012     9 NA           0
10 "                                   Ford"  2012    10 NA           0
# ... with 98 more rows

如何保存?

【问题讨论】:

  • 这是相同数据的输出吗?通过应用您的示例,我没有得到相同数量的行
  • 是的,仔细检查。这是我的输出
  • 对我来说,同样的代码是给72 x 5tidyr::complete(df, car = unique(car), year = 2012:2014, month=1:12, fill=list(amount=0)) # A tibble: 72 x 5

标签: r tidyr


【解决方案1】:

我们可以把它放在nesting

library(tidyverse)
df %>% 
  complete(car = unique(car), year = 2012:2014, month = 1:12, 
            nesting(country), fill = list(amount = 0))

【讨论】:

  • 适用于多列?
  • @Forge 是的,您可以将列放在嵌套中,即nesting(col1, col2),
  • 无效。嵌套不会保留国家/地区。它返回了福特 JP 和马自达美国的组合@akrun
【解决方案2】:

由于您忽略了您在原始问题的第二个问题中打开了一个新问题,因此只需维护一个元数据数据框:

read.table(textConnection("car,year,month,amount
Mazda,2012,02,2344
Ford,2012,04,235234
Mazda,2012,03,3455
Mazda,2012,04,43554
Mazda,2012,05,9854
Mazda,2012,06,32556
Ford,2013,01,2345"),
           sep = ",", header = TRUE, stringsAsFactors = FALSE) -> xdf


merge(
  expand.grid(car = unique(xdf$car), year =2012:2014, month=1:12),
  xdf, by = c("car", "year", "month"), all.x = TRUE
) -> x2
x2$amount <- ifelse(is.na(x2$amount), 0, x2$amount)

data.frame(
  car = c("Mazda", "Ford"),
  country = c("JP", "US"),
  stringsAsFactors = FALSE
) -> car2country_df

merge(x2, car2country_df)

通过tidyverse:

tidyr::complete(
  xdf, car = unique(car), year = 2012:2014, month=1:12, fill=list(amount=0)
) %>% 
  dplyr::left_join(car2country_df)

【讨论】:

  • 我的错,我被指示针对不同的主题做不同的问题,即使它是前一个问题的后续问题。我忘了警告你。道歉
猜你喜欢
  • 2023-04-01
  • 2019-05-02
  • 2021-09-21
  • 1970-01-01
  • 2021-07-26
  • 1970-01-01
  • 2016-01-03
  • 2018-02-19
  • 1970-01-01
相关资源
最近更新 更多