我有一個包含多行和多列的大型資料集。我想通過列中缺失值的數量來更改列的順序,以便具有最多NAs 的變數是第一列,而具有最少NAs 的變數是最后一列。
到目前為止,我嘗試使用dplyr'sselect但沒有得到我想要的。
df_ordered <- df %>%
select(order(is.na(df)))
uj5u.com熱心網友回復:
你做:
df <- df[order(-colSums(apply(df, 2, is.na)))]
或者
df <- df[order(colSums(apply(df, 2, is.na)), decreasing = T)]
使用 dplyr 更詳細:
df <- df %>% relocate(
df %>% summarise(across(everything() , ~sum(is.na(.)))) %>%
unlist() %>% order(decreasing=T))
uj5u.com熱心網友回復:
這是一個使用dplyrwith的選項colSums,我們可以在其中獲取每列中 s 的總和NA,然后對該命名的數字向量進行排序,然后回傳select陳述句的名稱。
library(dplyr)
df %>%
select(names(sort(colSums(is.na(.)), decreasing = TRUE)))
輸出
X10 X5 X6 X1 X2 X3 X4 X8 X9 X7
1 NA 0 NA NA 1 NA NA NA 1 NA
2 NA 1 NA NA 0 1 0 1 NA 0
3 0 NA NA 1 NA 1 1 1 0 1
4 NA NA 1 0 1 0 1 NA NA 1
5 NA NA 0 NA 0 0 0 1 0 1
6 1 NA NA 1 0 NA 1 0 1 1
7 1 1 1 1 0 0 1 0 0 1
8 NA 0 1 1 1 0 0 1 1 0
9 NA NA 0 0 NA 0 0 1 1 0
10 NA 1 NA 0 0 0 NA 1 0 1
資料
df <- structure(list(X1 = c(NA, NA, 1L, 0L, NA, 1L, 1L, 1L, 0L, 0L),
X2 = c(1L, 0L, NA, 1L, 0L, 0L, 0L, 1L, NA, 0L), X3 = c(NA,
1L, 1L, 0L, 0L, NA, 0L, 0L, 0L, 0L), X4 = c(NA, 0L, 1L, 1L,
0L, 1L, 1L, 0L, 0L, NA), X5 = c(0L, 1L, NA, NA, NA, NA, 1L,
0L, NA, 1L), X6 = c(NA, NA, NA, 1L, 0L, NA, 1L, 1L, 0L, NA
), X7 = c(NA, 0L, 1L, 1L, 1L, 1L, 1L, 0L, 0L, 1L), X8 = c(NA,
1L, 1L, NA, 1L, 0L, 0L, 1L, 1L, 1L), X9 = c(1L, NA, 0L, NA,
0L, 1L, 0L, 1L, 1L, 0L), X10 = c(NA, NA, 0L, NA, NA, 1L,
1L, NA, NA, NA)), class = "data.frame", row.names = c(NA,
-10L))
uj5u.com熱心網友回復:
您的代碼在正確的軌道上,但您需要跨列映射,并使用mean(或sum) 將每一列折疊為一個數字。
library(dplyr)
library(purrr)
dat <- data.frame(
x2 = c(1, NA, 2, NA),
x3 = c(NA, NA, NA, 4),
x1 = c(1, 2, NA, 4)
)
dat %>%
select(rev(order(map_dbl(., ~ mean(is.na(.x))))))
x3 x2 x1
1 NA 1 1
2 NA NA 2
3 NA 2 NA
4 4 NA 4
uj5u.com熱心網友回復:
為了簡潔起見,Ric Villalba 的回答略有不同,以 R 和 {dplyr} 為基礎:
set.seed(1)
d <- data.frame(matrix(sample(c(1:5, NA), 49, T, prob = c(rep(1, 5), 5)), ncol = 7))
# base R
d[,order(-colSums(is.na(d)))]
#> X4 X2 X5 X1 X3 X6 X7
#> 1 NA 4 2 NA 5 4 5
#> 2 4 4 NA NA NA 5 3
#> 3 NA NA NA 3 5 NA 3
#> 4 NA NA 3 1 1 5 5
#> 5 NA NA NA NA NA NA NA
#> 6 NA 4 NA 2 5 2 NA
#> 7 NA NA 2 1 1 4 5
# with tidyverse
library(dplyr)
d %>%
select(order(-colSums(is.na(.))))
#> X4 X2 X5 X1 X3 X6 X7
#> 1 NA 4 2 NA 5 4 5
#> 2 4 4 NA NA NA 5 3
#> 3 NA NA NA 3 5 NA 3
#> 4 NA NA 3 1 1 5 5
#> 5 NA NA NA NA NA NA NA
#> 6 NA 4 NA 2 5 2 NA
#> 7 NA NA 2 1 1 4 5
使用reprex v2.0.2創建于 2022-11-07
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/529056.html
標籤:rdplyr呐山口
上一篇:使用空間資料匯入CSV
