我有一個資料框的命名串列,它們都包含相同的列,但是對于其中一些資料框,其中一些列是空的。我希望回傳的是串列中資料框的名稱,以及空列的名稱。
下面的 repex 反映了我在完整問題上使用的程序
library(tidyverse)
data("diamonds")
data1 <- diamonds
data1$color <- NA
data1$price <- NA
data2 <- diamonds
data2$carat <- NA
data1$Type <- "data1"
data2$Type <- "data2"
data1%>%
bind_rows(data2) -> dataFull
dataSplit <- split(dataFull, f = dataFull$Type)
for(i in dataSplit){
which(sapply(dataSplit[[i]], function(x) all(is.na(x))))
}
我的希望是回傳類似的東西
data1:價格,顏色
資料2:克拉
我已經嘗試過上面包含的非常基本的 for 回圈,這當然不是我的強項。
uj5u.com熱心網友回復:
您的sapply想法是正確的,但是您需要將每個資料框的名稱與輸出進行子集化。此外,由于您正在加載 tidyverse,為了簡潔起見,您也可以使用map而不是回圈:
map(dataSplit, ~ names(.x)[sapply(.x, \(x) all(is.na(x)))])
#> $data1
#> [1] "color" "price"
#>
#> $data2
#> [1] "carat"
uj5u.com熱心網友回復:
library(tidyverse)
data("diamonds")
data1 <- diamonds
data1$color <- NA
data1$price <- NA
data2 <- diamonds
data2$carat <- NA
data1$Type <- "data1"
data2$Type <- "data2"
data1%>%
bind_rows(data2) -> dataFull
dataSplit <- split(dataFull, f = dataFull$Type)
lapply(dataSplit, function(x) {
cn <- colnames(x)
isempty <- apply(x, 2, function(col) is.na(col) |> all())
cn[ isempty ]
})
$data1
[1] "color" "price"
$data2
[1] "carat"
uj5u.com熱心網友回復:
使用select
library(dplyr)
library(purrr)
map(dataSplit, ~ .x %>%
select(where(~ all(is.na(.x)))) %>%
names)
$data1
[1] "color" "price"
$data2
[1] "carat"
或在base R
lapply(dataSplit, \(x) names(x)[!colSums(!is.na(x))])
$data1
[1] "color" "price"
$data2
[1] "carat"
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/530793.html
標籤:rfor循环
下一篇:在r中按組計算加權滾動平均值?
