【问题标题】:"tidyr like" fill na from different column“tidyr like”从不同的列填充 na
【发布时间】:2017-11-09 11:39:16
【问题描述】:

我有一个缺失值的数据框是某个列(谁没有)。 例如:

df <- data.frame(x = c(2,NA,4), y = 5:7)
df
   x y
1  2 5
2 NA 6
3  4 7

我想用不同列的值替换缺失值。显然有很多方法可以做到这一点,例如:

 df %>%
   mutate(x = ifelse(is.na(x), y, x))

  x y
1 2 5
2 6 6
3 4 7

但是,我正在寻找更优雅的东西,例如

df %>% fill(x,y) 

但找不到任何东西。这样的事情存在吗?

谢谢!

【问题讨论】:

  • 你可以使用 dplyr 的 coalesce 函数来代替 ifelse,即 df %&gt;% mutate(x = coalesce(x, as.numeric(y)))
  • 如果有一个纯粹的tidyr 解决方案,我敢打赌它会出现在这里:How to implement coalesce efficiently in R
  • 感谢您的建议。

标签: r dplyr tidyr tidyverse


【解决方案1】:

您希望更改单个列中的值,同时保持相同的行数。 tidyverse 的实现方式是dplyr::mutate,而你想要的具体操作的 tidyverse 实现是dplyr::coalesce,正如 docendo discimus 所建议的那样:

df %>% mutate(x = coalesce(x, y))

如果有一个函数将这两个步骤结合起来,事情会不那么整洁和不那么一致,因为它不是在操作整个数据框,而只是一个列。它也不太灵活,因为coalesce 可以用于向量,无论它们是否在数据框中,这很好!


(我实际上不喜欢tidyr::fill - 我认为它是一致的,因为它对数据框的所有列进行操作,但我更喜欢它采用单个向量并且通常在mutate 中使用。mutate_all(fill) 会很容易做整个数据框。所以我最终仍然依赖zoo::na.locf作为一般用途。)

【讨论】:

  • 谢谢@Gregor,我不熟悉coalesce,它确实满足了我的需求。
【解决方案2】:

我知道我没有完全回答这个问题,但我发现标准数据框的方式还不错:

df$x[is.na(df$x)] <- df$y[is.na(df$x)]

data.table 的方式相当简单优雅:

df[is.na(x),x := y]

【讨论】:

  • 谢谢@denis,我同意 data.table 的方式简单而优雅,但总的来说我更喜欢 tidyverse 用户
【解决方案3】:

试试这个,祝你好运

df <- t(apply(df, 1, function(x) if(any(is.na(x))) rep(x[!is.na(x)], 2) else x))
as.data.frame(df)

【讨论】:

  • 这将转换为矩阵,从而破坏数据框中存在的任何class 差异。
猜你喜欢
  • 2019-05-12
  • 2021-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多