【问题标题】:error -x should be numeric in data frame错误 -x 在数据框中应该是数字
【发布时间】:2018-02-13 16:39:01
【问题描述】:

我有这样的数据集:

name state  num1 num2 num3
abc    rt    10   40   8
def    ka    20   50   15
ert    pn    30   60   16

我想要每一行的 rowsums。使用 rowsums(data) 时,它抛出的错误如 x 应该是数字。所以新列应该是 num1,num2 和 num3 的总和

【问题讨论】:

  • 试试 data$newCol <- rowSums(data[grep("num\\d+", names(data))] 或使用 tidyverse data %>% select(matches("num\\d+")) %>% reduce('+') %>% mutate(data, newCol= .)
  • 感谢您的回复。但这是 z dummy dataset.num1 只是我的专栏的虚拟名称
  • rowsums(data[,sapply(data, is.numeric)])
  • 代码也有点假。您可以根据您的列名更改grep 中的模式。在第二种情况下,您可以使用select_if 而不是selectdata %>% select_if(is.numeric) 并使用reduce
  • rowsums(data[,sapply(data, is.numeric)]) :这个有效。感谢 Renu 和 Akrun

标签: r excel


【解决方案1】:

一些建议的解决方案。但是,首先,像往常一样,创建一些日期,

dta <- structure(list(name = structure(1:3, .Label = c("abc", "def", 
"ert"), class = "factor"), state = structure(c(3L, 1L, 2L), .Label = c("ka", 
"pn", "rt"), class = "factor"), num1 = c(10L, 20L, 30L), num2 = c(40L, 
50L, 60L), num3 = c(8L, 15L, 16L)), .Names = c("name", "state", 
"num1", "num2", "num3"), class = "data.frame", row.names = c(NA, 
-3L))

其次,几乎总是显示数据,

dta
#>   name state num1 num2 num3
#> 1  abc    rt   10   40    8
#> 2  def    ka   20   50   15
#> 3  ert    pn   30   60   16

也许也可以使用str(),因为它与理解这里的 spciac 问题有关,

str(dta)
#> 'data.frame':    3 obs. of  5 variables:
#>  $ name : Factor w/ 3 levels "abc","def","ert": 1 2 3
#>  $ state: Factor w/ 3 levels "ka","pn","rt": 3 1 2
#>  $ num1 : int  10 20 30
#>  $ num2 : int  40 50 60
#>  $ num3 : int  8 15 16

问题源于数据是因子和整数的混合,我们无法对因子求和

现在介绍一些解决方案。

首先,akrun's first solution

rowSums(dta[grep("num\\d+", names(dta))])
#> [1]  58  85 106

第二,Renu's solution

rowSums(dta[,sapply(dta, is.numeric)])
#> [1]  58  85 106

三、akrun's second solution的略微改写版,

# install.packages(c("tidyverse"), dependencies = TRUE)
library(tidyverse)
dta %>% select(matches("num\\d+")) %>% mutate(rowsum = rowSums(.))
#>   num1 num2 num3 rowsum
#> 1   10   40    8     58
#> 2   20   50   15     85
#> 3   30   60   16    106

最后,这个不错的 选项,

# install.packages(c("plyr"), dependencies = TRUE)
plyr::numcolwise(sum)(dta)
#>   num1 num2 num3
#> 1   60  150   39

最后,here a almost identical question。现在它们至少是联系在一起的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-28
    • 2018-01-27
    • 1970-01-01
    • 1970-01-01
    • 2018-12-04
    • 2011-11-30
    • 1970-01-01
    • 2020-12-19
    相关资源
    最近更新 更多