【问题标题】:Create data frame containing the row position of missing values创建包含缺失值行位置的数据框
【发布时间】:2021-09-15 06:00:59
【问题描述】:

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

我知道我可以使用 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

【问题讨论】:

    标签: r list dataframe na missing-data


    【解决方案1】:

    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
    

    【讨论】:

      【解决方案2】:

      使用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
      

      【讨论】:

        猜你喜欢
        • 2011-12-20
        • 1970-01-01
        • 1970-01-01
        • 2019-11-23
        • 2021-10-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-18
        相关资源
        最近更新 更多