Конвертировать нечисловые строки и столбцы в ноль - PullRequest
0 голосов
/ 31 мая 2018

У меня есть эти данные из пакета r, где X - это набор данных со всеми данными

library(ISLR)
data("Hitters")
X=Hitters
head(X)

вот одна часть данных:

                 AtBat Hits HmRun Runs RBI Walks Years CAtBat CHits CHmRun CRuns CRBI CWalks League Division PutOuts Assists Errors Salary NewLeague
-Andy Allanson      293   66     1   30  29    14     1    293    66      1    30   29     14      A        E     446      33     20     NA         A
-Alan Ashby         315   81     7   24  38    39    14   3449   835     69   321  414    375      N        W     632      43     10  475.0         N
-Alvin Davis        479  130    18   66  72    76     3   1624   457     63   224  266    263      A        W     880      82     14  480.0         A
-Andre Dawson       496  141    20   65  78    37    11   5628  1575    225   828  838    354      N        E     200      11      3  500.0         N
-Andres Galarraga   321   87    10   39  42    30     2    396   101     12    48   46     33      N        E     805      40      4   91.5         N
-Alfredo Griffin    594  169     4   74  51    35    11   4408  1133     19   501  336    194      A        W     282     421     25  750.0         A

Я хочупреобразовать все столбцы и строки с нечисловыми значениями в ноль, есть ли простой способ сделать это.Я нашел здесь пример , как просто удалить строки для одного столбца, но для большего я должен сделать это для каждого столбца вручную.

Есть ли в r функция, которая делает это для всех столбцов и строк?

Ответы [ 3 ]

0 голосов
/ 31 мая 2018

Вы можете получить числовые столбцы с помощью sapply/inherits.

X <- Hitters
inx <- sapply(X, inherits, c("integer", "numeric"))
Y <- X[inx]

Тогда было бы бессмысленно удалять строки с нечисловыми записями, они уже были удалены, но вы могли быделать

inx <- apply(Y, 1, function(y) all(inherits(y, c("integer", "numeric"))))
Y[inx, ]
0 голосов
/ 31 мая 2018
library(ISLR)
data("Hitters")
d = head(Hitters)

library(dplyr)

d %>% 
  mutate_if(function(x) !is.numeric(x), function(x) 0) %>%   # if column is non numeric add zeros
  mutate_all(function(x) ifelse(is.na(x), 0, x))             # if there is an NA element replace it with 0

#   AtBat Hits HmRun Runs RBI Walks Years CAtBat CHits CHmRun CRuns CRBI CWalks League Division PutOuts Assists Errors Salary NewLeague
# 1   293   66     1   30  29    14     1    293    66      1    30   29     14      0        0     446      33     20    0.0         0
# 2   315   81     7   24  38    39    14   3449   835     69   321  414    375      0        0     632      43     10  475.0         0
# 3   479  130    18   66  72    76     3   1624   457     63   224  266    263      0        0     880      82     14  480.0         0
# 4   496  141    20   65  78    37    11   5628  1575    225   828  838    354      0        0     200      11      3  500.0         0
# 5   321   87    10   39  42    30     2    396   101     12    48   46     33      0        0     805      40      4   91.5         0
# 6   594  169     4   74  51    35    11   4408  1133     19   501  336    194      0        0     282     421     25  750.0         0

Если вы хотите избежать function(x), вы можете использовать это

d %>% 
  mutate_if(Negate(is.numeric), ~0) %>%  
  mutate_all(~ifelse(is.na(.), 0, .)) 
0 голосов
/ 31 мая 2018

Чтобы удалить нечисловые столбцы, возможно что-то вроде этого?

df %>%
    select(which(sapply(., is.numeric)))
#                  AtBat Hits HmRun Runs RBI Walks Years CAtBat CHits CHmRun
#-Andy Allanson      293   66     1   30  29    14     1    293    66      1
#-Alan Ashby         315   81     7   24  38    39    14   3449   835     69
#-Alvin Davis        479  130    18   66  72    76     3   1624   457     63
#-Andre Dawson       496  141    20   65  78    37    11   5628  1575    225
#-Andres Galarraga   321   87    10   39  42    30     2    396   101     12
#-Alfredo Griffin    594  169     4   74  51    35    11   4408  1133     19
#                  CRuns CRBI CWalks PutOuts Assists Errors Salary
#-Andy Allanson       30   29     14     446      33     20     NA
#-Alan Ashby         321  414    375     632      43     10  475.0
#-Alvin Davis        224  266    263     880      82     14  480.0
#-Andre Dawson       828  838    354     200      11      3  500.0
#-Andres Galarraga    48   46     33     805      40      4   91.5
#-Alfredo Griffin    501  336    194     282     421     25  750.0

или

df %>%
    select(-which(sapply(., function(x) is.character(x) | is.factor(x))))

Или намного аккуратнее (благодаря @AntoniosK):

df %>% select_if(is.numeric)

Обновление

Чтобы дополнительно заменить NA s на 0, вы можете сделать

df %>% select_if(is.numeric) %>% replace(is.na(.), 0)
#                  AtBat Hits HmRun Runs RBI Walks Years CAtBat CHits CHmRun
#-Andy Allanson      293   66     1   30  29    14     1    293    66      1
#-Alan Ashby         315   81     7   24  38    39    14   3449   835     69
#-Alvin Davis        479  130    18   66  72    76     3   1624   457     63
#-Andre Dawson       496  141    20   65  78    37    11   5628  1575    225
#-Andres Galarraga   321   87    10   39  42    30     2    396   101     12
#-Alfredo Griffin    594  169     4   74  51    35    11   4408  1133     19
#                  CRuns CRBI CWalks PutOuts Assists Errors Salary
#-Andy Allanson       30   29     14     446      33     20    0.0
#-Alan Ashby         321  414    375     632      43     10  475.0
#-Alvin Davis        224  266    263     880      82     14  480.0
#-Andre Dawson       828  838    354     200      11      3  500.0
#-Andres Galarraga    48   46     33     805      40      4   91.5
#-Alfredo Griffin    501  336    194     282     421     25  750.0 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...