![](/img/trans.png)
[英]List the names and row numbers of missing data in a data.frame in R?
[英]Return list of column names with missing (NA) data for each row of a data frame in R
我正在尝试为数据框中的每个 ID# 创建一个带有 NA 值的数据列表,以便我可以跟踪丢失的数据。 我有一个数据框,其中每一行都是一个 ID#,每一列都是一个变量名。 每个 ID# 可能有不同的缺失数据,因此我想将此信息压缩到一个两列表中。 目前,我的表看起来像这样:
ID Var1 Var2 Var3 Var4 Var5
1 10 T NA 2 NA
2 15 F 50 2 NA
3 12 NA 41 2 NA
4 NA NA NA 1 NA
5 NA F NA NA NA
...
我希望得到看起来像这样的输出:
ID Missing Variables
1 Var3, Var5
2 Var5
3 Var2, Var5
4 Var1, Var2, Var3, Var5
5 Var1, Var3, Var4, Var5
...
我很困惑如何为每个丢失的数据条目返回列名。 我知道你可能可以用 for 循环做这样的事情,但除此之外我有点迷失了。 任何帮助深表感谢!
这是一个tidyverse
解决方案。
df <- read_table("
ID Var1 Var2 Var3 Var4 Var5
1 10 T NA 2 NA
2 15 F 50 2 NA
3 12 NA 41 2 NA
4 NA NA NA 1 NA
5 NA F NA NA NA", col_names = TRUE)
library(dplyr)
library(tidyr)
df %>%
mutate(across(starts_with("var"), is.na)) %>% # replace all NA with TRUE and else FALSE
pivot_longer(-ID, names_to = "var") %>% # pivot longer
filter(value) %>% # remove the FALSE rows
group_by(ID) %>% # group by the ID
summarise(`Missing Variables` = toString(var)) # convert the variable names to a string column
`summarise()` ungrouping output (override with `.groups` argument)
# A tibble: 5 x 2
ID `Missing Variables`
<dbl> <chr>
1 1 Var3, Var5
2 2 Var5
3 3 Var2, Var5
4 4 Var1, Var2, Var3, Var5
5 5 Var1, Var3, Var4, Var5
这是一种可能的基本 R 方法,它返回一个向量:
result <- apply(
X = is.na(my_df),
MARGIN = 1,
FUN = function(x) paste(colnames(my_df)[x], collapse = ", ")
)
> result
[1] "Var3, Var5" "Var5" "Var2, Var5" "Var1, Var2, Var3, Var5" "Var1, Var3, Var4, Var5"
看起来您正在请求一个data.frame
对象,您可以轻松到达那里:
data.frame(ID = my_df$ID, `Missing Variables` = result, check.names = FALSE)
# Note that the data.frame specification does not consider variable names
# containing spaces to be syntactically valid, so you have to disable the
# check if you want the variable name you have specified. This may cause
# other problems 'down the line'.
ID Missing Variables
1 1 Var3, Var5
2 2 Var5
3 3 Var2, Var5
4 4 Var1, Var2, Var3, Var5
5 5 Var1, Var3, Var4, Var5
但是,您还说您正在寻找list
- 如果是这样:
> setNames(as.list(result), test$ID)
$`1`
[1] "Var3, Var5"
$`2`
[1] "Var5"
$`3`
[1] "Var2, Var5"
$`4`
[1] "Var1, Var2, Var3, Var5"
$`5`
[1] "Var1, Var3, Var4, Var5"
这是否有效:
> library(dplyr)
> df
# A tibble: 5 x 6
ID Var1 Var2 Var3 Var4 Var5
<dbl> <dbl> <lgl> <dbl> <dbl> <lgl>
1 1 10 TRUE NA 2 NA
2 2 15 FALSE 50 2 NA
3 3 12 NA 41 2 NA
4 4 NA NA NA 1 NA
5 5 NA FALSE NA NA NA
> df$reps <- sapply(apply(df[2:6], 1, function(x) which(is.na(x))), names)
> df %>% unnest(reps) %>% group_by(ID) %>% summarise(`Missing Variables` = paste0(reps, collapse = ', '))
`summarise()` ungrouping output (override with `.groups` argument)
# A tibble: 5 x 2
ID `Missing Variables`
<dbl> <chr>
1 1 Var3, Var5
2 2 Var5
3 3 Var2, Var5
4 4 Var1, Var2, Var3, Var5
5 5 Var1, Var3, Var4, Var5
解决它的dplyr
方法
df <- read.table(text = 'ID Var1 Var2 Var3 Var4 Var5
1 10 T NA 2 NA
2 15 F 50 2 NA
3 12 NA 41 2 NA
4 NA NA NA 1 NA
5 NA F NA NA NA', header = T)
library(dplyr)
df %>%
rowwise() %>%
summarise(ID, missing = toString(names(.)[-1][seq_along(c_across(starts_with('Var'))) * is.na(c_across(starts_with('Var')))]),
.groups = 'drop')
#> # A tibble: 5 x 2
#> ID missing
#> <int> <chr>
#> 1 1 Var3, Var5
#> 2 2 Var5
#> 3 3 Var2, Var5
#> 4 4 Var1, Var2, Var3, Var5
#> 5 5 Var1, Var3, Var4, Var5
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.