【问题标题】:Convert non-numeric rows and columns to zero将非数字行和列转换为零
【发布时间】:2018-05-31 10:39:35
【问题描述】:

我有来自 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 中是否有任何函数对所有列和行执行此操作?

【问题讨论】:

  • 您确定要删除所有非数值的列和行吗?在上面的示例中,应删除所有内容。对吗?
  • @AntoniosK 是的,我刚刚意识到,谢谢,我将更新我希望所有非数字都为零的问题
  • 您确定不只需要删除非数字列吗?
  • 我假设您将NA 视为非数字,对吧?
  • @AntoniosK 是的,没错,我只想有数值,但仍然有一个矩阵。所以将它们设为零仍然是一种选择

标签: r


【解决方案1】:

要删除非数字列,也许是这样的?

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)

更新

要将NAs 替换为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 

【讨论】:

  • 谢谢,但我认为我做错了,因为删除所有非数字我会让它们全部为零,我只是编辑了问题
  • 你也可以用这个d %>% select_if(is.numeric) :-)
  • @Ville 我已经编辑了我的答案以解决您的评论,请看一下。
【解决方案2】:
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, .)) 

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-17
      • 2018-10-21
      • 2017-11-09
      • 2016-12-07
      • 2017-12-13
      • 1970-01-01
      • 2013-10-01
      • 1970-01-01
      相关资源
      最近更新 更多