如何用R中的多列填充缺失的值

  • 本文关键字:填充 何用 r
  • 更新时间 :
  • 英文 :


我有一个电影数据集,其中有几个列列出了电影中出现的演员。数据很混乱,有时第一列包含缺失的值,但第二列包含参与者的名称。我想保留所有actor列,但将每个不丢失的值移到最早的列。例如:

movies <- data.frame(actor1=c("A","B",NA,"C",NA), actor2=c(NA, "Z", "W", NA, "X"), actor3=c("L","M","N","O","P"))
actor1 actor2 actor3
1      A   <NA>      L
2      B      Z      M
3   <NA>      W      N
4      C   <NA>      O
5   <NA>      X      P

应该变成:

actor1 actor2 actor3
1      A      L   <NA>
2      B      Z      M
3      W      N   <NA>
4      C      O   <NA>
5      X      P   <NA>

CCD_ 1将把W和X拉到第一列。完美的但是,我如何对后续的列执行同样的操作呢?例如,由于W是从actor2拉到actor1的,我现在希望actor2的第三行具有值N,而不是W。

一个选项是使用applyMARGIN=1在行上循环,连接(c(非NA元素,然后连接NA元素

movies[] <- t(apply(movies, 1, function(x) c(x[!is.na(x)], x[is.na(x)])))
movies
# actor1 actor2 actor3
#1      A      L   <NA>
#2      B      Z      M
#3      W      N   <NA>
#4      C      O   <NA>
#5      X      P   <NA>

此外,如果它是列的子集,则使用startsWith

i1 <- startsWith(names(movies), "actor")

并且只更新那些列

movies[i1] <-  t(apply(movies[i1], 1, function(x) c(x[!is.na(x)], x[is.na(x)])))

首先识别actors*列的方法(可能存在不同类型的列(。基本上,这会将NA从行中剥离出来,并在之后协调length

ac.cols <- grep("^actor\d$", names(movies), value=TRUE)
movies[ac.cols] <- lapply(movies[ac.cols], as.character)
res <- setNames(do.call(rbind.data.frame, 
lapply(1:nrow(movies), function(m) 
`length<-`(
na.omit(unlist(movies[m, ac.cols])),
ncol(movies)))), 
ac.cols)
res
#   actor1 actor2 actor3
# 1      A      L   <NA>
# 2      B      Z      M
# 3      W      N   <NA>
# 4      C      O   <NA>
# 5      X      P   <NA>

最新更新