使用group_by时重新排序NA的位置

时间:2018-01-31 14:28:36

标签: r dataframe dplyr na tibble

我想在另一个分类变量的每个级别内重新排列NA的位置。例如,使用此数据框:

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

我想改变一个新列,如:

df$newvar <= c(44,23,NA,76,NA,NA)

我会认为以下内容可行,但事实并非如此:

dfb <- df %>% group_by(fact) %>% mutate(newvar = df$value[order(is.na(df$value))])

关于我如何做到这一点的任何想法?

4 个答案:

答案 0 :(得分:5)

您应该删除mutate语句中的com.google.apphosting.api部分,否则您指的是完整列,而不是每组的列。所以这应该工作正常:

df$

输出:

df %>% group_by(fact) %>% mutate(newvar = value[order(is.na(value))])

答案 1 :(得分:3)

您甚至不需要使用dplyr,您可以使用基座R执行此操作:

df$newvar <- ave(df$value, df$fact, FUN = function(x) x[order(-x)])

df
#  fact id value newvar
#1    1  1    NA     44
#2    1  2    44     23
#3    1  3    23     NA
#4    2  4    NA     76
#5    2  5    NA     NA
#6    2  6    76     NA

答案 2 :(得分:3)

另一个想法是使用lead()函数向前移动每组中的NA数。即。

library(dplyr)

df %>% 
 group_by(fact) %>% 
 mutate(new = lead(value, sum(is.na(value))))

给出了

# A tibble: 6 x 4
# Groups:   fact [2]
   fact    id value   new
  <dbl> <int> <dbl> <dbl>
1  1.00     1  NA    44.0
2  1.00     2  44.0  23.0
3  1.00     3  23.0  NA  
4  2.00     4  NA    76.0
5  2.00     5  NA    NA  
6  2.00     6  76.0  NA  

注意:这只会在您的NAs位于顶部而底部需要它们时才有效

答案 3 :(得分:1)

还有一个建议,使用arrange与dplyr动词保持一致:

df %>%
  mutate(newvar = 
    arrange(df, fact, is.na(value), id) %>% pull(value)
  )