R 重新排列NA和x27的位置;s使用组时由

R 重新排列NA和x27的位置;s使用组时由,r,dataframe,dplyr,na,tibble,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您应该删除mutate语句中的df$部分,否则您指的是完整列,而不是每个组的列。所以这应该很好: df %>% group_by(fact) %>% mutate(newvar = value[order(is.na(value))])

我想重新排列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您应该删除mutate语句中的
df$
部分,否则您指的是完整列,而不是每个组的列。所以这应该很好:

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

# A tibble: 6 x 4
# Groups: fact [2]
   fact    id value newvar
  <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  
#一个tible:6 x 4
#小组:事实[2]
事实id值newvar
1 1.00 1 NA 44.0
2  1.00     2  44.0   23.0
3 1.00 3 23.0北美
42.00 4 NA 76.0
5 2.00 5不适用
62.00 6 76.0北美

您甚至不需要使用
dplyr
您可以使用base
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

df$newvar另一个想法是使用
lead()
函数按每组中的NAs数量前移。i、 e

library(dplyr)

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

#一个tible:6 x 4
#小组:事实[2]
事实id值新建
1 1.00 1 NA 44.0
2  1.00     2  44.0  23.0
3 1.00 3 23.0北美
42.00 4 NA 76.0
5 2.00 5不适用
62.00 6 76.0北美

注意:只有当您的NAs位于顶部,而您需要它们位于底部时,此操作才有效

请使用与dplyr动词一致的
排列
,再提出一个建议:

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

我认为
和(df,value[顺序(事实,-value)])
也应该基于OP的example@akrun,这是一个很好的观点。然而,我倾向于不这样做,因为正如您所暗示的,如果
fact
尚未订购,它可能会产生意外的结果dplyr,比如OP
pull
在版本>=0.7.0()
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  
df %>%
  mutate(newvar = 
    arrange(df, fact, is.na(value), id) %>% pull(value)
  )