将非数字行和列转换为零

时间:2018-05-31 10:39:36

标签: r

我有来自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

我想将所有列和非数值的行转换为零,有没有简单的方法来执行此操作。 我在这里找到example如何删除一列的行但是为了更多,我必须手动为每一列执行此操作。

是否在r中为所有列和行执行此操作的任何函数?

3 个答案:

答案 0 :(得分:2)

要删除非数字列,可能是这样的吗?

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替换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 

答案 1 :(得分:1)

您可以使用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, ]

答案 2 :(得分:1)

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, .))