考虑一个有序的数据框,其中一列由值和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)
反正我能做到吗?谢谢!
答案 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