创建包含缺失值行位置的数据框

Create data frame containing the row position of missing values

我想创建一个 table,其中包含原始数据框中缺失值的行位置。这实际上会将第一个 table 作为输入并在该 table 下面创建 table。

我知道我可以使用 apply 来创建一个具有该行位置的列表,但我正在努力获取该列表并制作一个数据框。

# Minimum working example

# Create dataset
data0 <- data.frame("A" = c(NA,NA,1,1), "B"= c(1,NA,1,1),"C"= c("john","john",NA,NA),"D"= c("john","john","john","john"))

# Create list of all rows containing missing values for a particular column then print as dataframe

list1<-apply(is.na(data0), 2, which)

> print(list1)
$A
[1] 1 2

$B
[1] 2
$C
[1] 3 4
$D
integer(0)

# Turn list1 to a data.frame leading to answer

sapply遍历list,将length分配给'data0'的nrow,在末尾附加NA元素较少的地方用 data.frame

包裹
as.data.frame(sapply(list1, `length<-`, nrow(data0)))

-输出

  A  B  C  D
1  1  2  3 NA
2  2 NA  4 NA
3 NA NA NA NA
4 NA NA NA NA

我们也可以这样做

library(dplyr)
data0 %>% 
    mutate(across(everything(), ~ replace(rep(NA_integer_, n()), 
         is.na(.), which(is.na(.)))[order(!is.na(.))]))
   A  B  C  D
1  1  2  3 NA
2  2 NA  4 NA
3 NA NA NA NA
4 NA NA NA NA

如果我们不需要对值进行排序,即位置保持在出现的相同位置

NA^(!is.na(data0)) * row(data0)
      A  B  C  D
[1,]  1 NA NA NA
[2,]  2  2 NA NA
[3,] NA NA  3 NA
[4,] NA NA  4 NA

使用 sapply 并从 data0 开始你可以做 -

sapply(data0, function(x) which(is.na(x))[seq_along(x)])

#      A  B  C  D
#[1,]  1  2  3 NA
#[2,]  2 NA  4 NA
#[3,] NA NA NA NA
#[4,] NA NA NA NA