创建包含缺失值行位置的数据框
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
我想创建一个 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