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

时间:2019-10-24 16:40:38

标签: 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>

coalesce()将W和X拉到第一列。完善。但是如何对后续的列做同样的事情?例如,由于W从actor2拉到actor1,所以我现在希望actor2的第三行的值为N,而不是W。

2 个答案:

答案 0 :(得分:2)

一种选择是将applyMARGIN=1一起使用以遍历行,将(NA)非NA元素后接c元素

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")

答案 1 :(得分:1)

首先标识actors*列的方法(可能存在不同种类的列)。基本上,这会将NA s从行中剔除,然后将length s统一。

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>