我想在另一个分类变量的每个级别内重新排列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))])
关于我如何做到这一点的任何想法?
答案 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)
)