Удаление всех пустых столбцов и строк в data.frame, когда строки не исчезают - PullRequest
2 голосов
/ 07 октября 2019

У меня есть два data.frames, dA ( ЗДЕСЬ ) и dB ( ЗДЕСЬ ). Они точно такие же, КРОМЕ того, что dB имеет один полностью пустой столбец и несколько пустых строк.

dA <- read.csv("https://raw.githubusercontent.com/izeh/m/master/irr3.csv", h = T)
dB <- read.csv("https://raw.githubusercontent.com/izeh/m/master/irr4.csv", h = T)

Я хочу удалить все пустые столбцы и все пустые строки в dB, чтобы dB стал точнокак dA.

В настоящее время я пытаюсь выполнить следующее для достижения своей цели , но похоже, что пустые строки не удаляются :

# remove columns with all NA
B1 <- dB[, colSums(is.na(dB)) != nrow(dB)]

# remove rows with all NA
B2 <- B1[rowSums(is.na(B1)) != ncol(B1), ]   # NOW, check by:  `nrow(B2)` the `NA` haven't 
                                             # been removed !!

Ответы [ 3 ]

2 голосов
/ 07 октября 2019

Вот вариант с Filter из base R

Filter(function(x) !all(is.na(x)), dB)
#  study.name  group.name outcome ESL prof scope type
#1  Shin.Ellis    ME.short       1   1    2     1    1
#2  Shin.Ellis     ME.long       1   1    2     1    1
#3  Shin.Ellis   DCF.short       1   1    2     1    2
#4  Shin.Ellis    DCF.long       1   1    2     1    2
#5  Shin.Ellis  Cont.short       1   1    2    NA   NA
#6  Shin.Ellis   Cont.long       1   1    2    NA   NA
#7                              NA  NA   NA    NA   NA
#8    Trus.Hsu       Exper       1   2    2     2    1
#...

или с any

Filter(function(x) any(!is.na(x)), dB)

Для удаления строк

B1[!!rowSums(!is.na(B1) & B1 != ""),] 

Или используя Reduce

B1[Reduce(`|`, lapply(B1, function(x) !is.na(x) & x != "" )),]
2 голосов
/ 07 октября 2019

У вас есть NA, а также пустые строки. Вы можете сделать

B1[rowSums(is.na(B1) | B1 == "") != ncol(B1), ]

#   study.name  group.name outcome ESL prof scope type
#1  Shin.Ellis    ME.short       1   1    2     1    1
#2  Shin.Ellis     ME.long       1   1    2     1    1
#3  Shin.Ellis   DCF.short       1   1    2     1    2
#4  Shin.Ellis    DCF.long       1   1    2     1    2
#5  Shin.Ellis  Cont.short       1   1    2    NA   NA
#6  Shin.Ellis   Cont.long       1   1    2    NA   NA
#8    Trus.Hsu       Exper       1   2    2     2    1
#.....

Мы также можем использовать filter_all с dplyr

library(dplyr)
B1 %>% filter_all(any_vars(!is.na(.) & . != ""))
1 голос
/ 07 октября 2019

Вы можете использовать replace для преобразования "" в NA и затем использовать is.na. Для удаления полных строк и строк вы можете использовать apply с функцией all.

x  <- is.na(replace(dB, dB=="", NA))
dB[!apply(x, 1, all), !apply(x, 2, all)]

или rowSums и colSums, как в вопросе:

x <- is.na(dB) | dB == ""
dB[rowSums(x) != ncol(x), colSums(x) != nrow(x)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...