Удалить пустые значения без изменения остальной части фрейма данных в r - PullRequest
0 голосов
/ 30 марта 2020

У меня есть этот фрейм данных (гораздо больше, это пример):

           V1        V2   V3   V4   V5
row1                       1    2    3
row2 Row1name row1class    4    3    8
row3                      12    6    3
row4 row2name row2class    3    7    5
row5 row3name row3class <NA> <NA> <NA>
row6 row4name row4class <NA> <NA> <NA>

Я хочу исправить данные, чтобы получить следующее:

           V1        V2   V3   V4   V5
row1 Row1name row1class    1    2    3
row2 Row2name row2class    4    3    8
row3 Row3name row3class   12    6    3
row4 Row4name row4class    3    7    5

Любой идея как убрать пустые места без изменения V3-V5?

Ответы [ 2 ]

3 голосов
/ 30 марта 2020

Если у вас одинаковое количество пустых и NA значений в каждом столбце, вы можете использовать

purrr::map_df(df,  ~.x[!(.x == '' | is.na(.x))])

#   V1       V2        V3    V4    V5   
#  <chr>    <chr>     <chr> <chr> <chr>
#1 Row1name row1class 1     2     3    
#2 row2name row2class 4     3     8    
#3 row3name row3class 12    6     3    
#4 row4name row4class 3     7     5    

и аналогично в базе R:

do.call(cbind.data.frame, lapply(df, function(x) x[!(x == '' | is.na(x))]))

Возможно, вы захотите используйте type.convert после использования вышеупомянутого, чтобы изменить класс столбцов на их соответствующие классы.

данные

df <- structure(list(V1 = c("", "Row1name", "", "row2name", "row3name", 
"row4name"), V2 = c("", "row1class", "", "row2class", "row3class", 
"row4class"), V3 = c("1", "4", "12", "3", NA, NA), V4 = c("2", 
"3", "6", "7", NA, NA), V5 = c("3", "8", "3", "5", NA, NA)), 
row.names = c("row1", "row2", "row3", "row4", "row5", "row6"),
class = "data.frame")
0 голосов
/ 30 марта 2020

<NA> указывает на символьные данные, где необходимо число c; transform!

dat[3:5] <- lapply(dat[3:5], as.numeric)

Теперь NA in rowSums удаляет строки NA.

res <- dat[!is.na(rowSums(dat[3:5])), ]

и восстанавливает первые два столбца, используя paste.

res <- dat[!is.na(rowSums(dat[3:5])), ]
res <- transform(res, 
          V1=paste0(rownames(res), "name"),
          V2=paste0(rownames(res), "Class"))

Результат

res
#            V1        V2 V3 V4 V5
# row1 row1name row1Class  1  2  3
# row2 row2name row2Class  4  3  8
# row3 row3name row3Class 12  6  3
# row4 row4name row4Class  3  7  5

Данные

dat <- structure(list(V1 = c("", "Row1name", "", "row2name", "row3name", 
"row4name"), V2 = c("", "row1class", "", "row2class", "row3class", 
"row4class"), V3 = c("1", "4", "12", "3", "<NA>", "<NA>"), V4 = c("2", 
"3", "6", "7", "<NA>", "<NA>"), V5 = c("3", "8", "3", "5", "<NA>", 
"<NA>")), row.names = c("row1", "row2", "row3", "row4", "row5", 
"row6"), class = "data.frame")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...