使用值交换NA,同时保留原始值顺序

时间:2018-01-31 12:05:46

标签: r dataframe

考虑一个有序的数据框,其中一列由值和NA组成,如下所示:

df <- data.frame(id=rep(1:6), value=c(NA,NA,23,45,12,76))

我想将NA的位置移动到数据帧的前两行,同时保持值的顺序如下:

df$new_value <- c(23,45,12,76,NA,NA)

反正我能做到吗?谢谢!

3 个答案:

答案 0 :(得分:3)

我们可以在order元素上使用NA

df$new_value <- df$value[order(is.na(df$value))]
df$new_value
#[1] 23 45 12 76 NA NA

通过执行is.na,它返回一个逻辑向量

 is.na(df$value)
 #[1]  TRUE  TRUE FALSE FALSE FALSE FALSE

在其上应用order会返回

order(is.na(df$value))
#[1] 3 4 5 6 1 2

因为FALSE按字母顺序排在TRUE之前。 order值是向量的初始位置索引。

可以更容易理解
sort(c(TRUE, FALSE, TRUE), index.return = TRUE)
#$x
#[1] FALSE  TRUE  TRUE

#$ix
#[1] 2 1 3

答案 1 :(得分:2)

另一个适用于的想法如果您的NAs位于数据框的最后,则使用lead中的dplyr函数来移动数据前进的位置。所以对于你的情况,它会是,

dplyr::lead(df$value, sum(is.na(df$value)))
#[1] 23 45 12 76 NA NA

答案 2 :(得分:1)

如果不聪明,也可以应用一些基本技术:

df$new_value <- c(df[!is.na(df$value), "value"], df[is.na(df$value), "value"])

  id value new_value
1  1    NA        23
2  2    NA        45
3  3    23        12
4  4    45        76
5  5    12        NA
6  6    76        NA