【问题标题】:R: fill missing value with prior values [duplicate]R:用先前的值填充缺失值[重复]
【发布时间】:2017-03-03 03:18:40
【问题描述】:

我有一个如下所示的数据框:

d <- data.frame(county = c("Abilene", rep(NA, 5), "Cook", rep(NA, 4), "Blah", NA, "Allegheny", rep(NA, 3)))

      county
1    Abilene
2       <NA>
3       <NA>
4       <NA>
5       <NA>
6       <NA>
7       Cook
8       <NA>
9       <NA>
10      <NA>
11      <NA>
12      Blah
13      <NA>
14 Allegheny
15      <NA>
16      <NA>
17      <NA>

我想在&lt;NA&gt; 中填写上一个非缺失县名的值。换句话说,我想这样结束:

  county
1       Abilene
2       Abilene
3       Abilene
4       Abilene
5       Abilene
6       Abilene
7       Cook
8       Cook
9       Cook
10      Cook
11      Cook
12      Blah
13      Blah
14      Allegheny
15      Allegheny
16      Allegheny
17      Allegheny

到目前为止,我一直在循环遍历d$county 中的每个值,用每个非空县值的名称更新一个临时变量,并重新填充每个单元格。对于大型数据框,这非常慢。我更愿意在dplyr 中执行此操作,尽管我也对任何其他解决方案持开放态度。

【问题讨论】:

标签: r loops missing-data


【解决方案1】:

使用tidyr,我们可以使用fill(data, vars)

library(tidyr)
fill(d, county)

【讨论】:

  • 仅供参考,tidyr::fill() 是用 C++ 编写的,根据我的经验,它比通过 R 循环执行等效操作快几个数量级。
  • @jdobres - 公平地说,没有人会在大数据的标准 R 循环中这样做,除非他们在折磨自己。
  • 取决于“大”的含义。我正在对一个包含大约十二列和大约 100k 行的小型数据集进行滚动填充操作,我认为这不会花费那么长时间。花了几个小时。 dplyr::fill() 在几秒钟内完成了同样的操作。
  • 我的意思是,您不需要在基本 R 中使用循环来执行此操作 - 像 stackoverflow.com/a/41752185/496803 这样的东西会更有效(对于数百万个案例而言,
【解决方案2】:

我们可以使用na.locf

library(zoo)
na.locf(d)

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2018-03-13
  • 2018-04-13
  • 1970-01-01
  • 1970-01-01
  • 2012-10-25
  • 1970-01-01
相关资源
最近更新 更多