“tidyr like”填写来自不同栏目的na

时间:2017-11-09 11:39:17

标签: r dplyr tidyr tidyverse

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

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) 

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

谢谢!

3 个答案:

答案 0 :(得分:4)

您希望更改单个列中的值,保持相同的行数。执行此操作的另一种方法是dplyr::mutate,您想要的特定操作的tidyverse实现是dplyr::coalesce,正如docendo discimus建议的那样:

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

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

(我实际上不喜欢tidyr::fill - 我认为它是一致的,因为它在数据框的所有列上运行,但我希望它采用单个向量并且通常在mutate内使用。 mutate_all(fill)很容易完成整个数据框架。所以我最终仍然依赖zoo::na.locf来进行一般使用。)

答案 1 :(得分:3)

我知道我没有完全回答这个问题,但我发现标准数据框架并没有那么糟糕:

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

和data.table方式非常简单和优雅:

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

答案 2 :(得分:0)

试试这个,祝你好运

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