rowSums使用列名称时出错

时间:2013-05-02 03:00:17

标签: r

我试图将人口普查数据与相当分散的数据(例如5年组中的年龄变量)进行细分,&amp;根据聚合创建摘要变量(例如,每个县的所有男性都是18岁以上)。我的解决方案是rowSums,例如county$MalesOver18 <- rowSums(county[,c(68:87)]),其中68-87岁的男性总数为男性18岁以上 - 工作正常。但是,对于500个变量,计算我的开始/结束列的顺序是没有效率的。

但是当我使用我首选的解决方案时,rowSums的列名称(例如rowSums(county[,c(H76007:H76025)],其中H vars =字段名称),我得到2个msg错误之一:

使用引号运行w / col名称:Error in "H76007":"H76025" : NA/NaN argument In addition: Warning messages: 1: In [.data.frame (county, , c("H76007":"H76025")) : NAs introduced by coercion 2: In [.data.frame (county, , c("H76007":"H76025")) : NAs introduced by coercion

运行w / col名称不在引号中:Error in [.data.frame (county, , c(H76007:H76025)) : object 'H76007' not found

我尝试过使用na.rm命令&amp;将我的变量设置为数字 - 尽管它们已经是整数 - 并且一切都没有结果。

任何指导?感谢。

2 个答案:

答案 0 :(得分:3)

按列名索引data.frames时,您无法使用:运算符。使用数值执行此操作时,它会创建一个序列:

> 2:5
[1] 2 3 4 5

然而,这并不适用于您所看到的字符数据:

> "foo":"bar"
Error in "foo":"bar" : NA/NaN argument
In addition: Warning messages:
...

那么,该怎么办?我可以想到两个选择:

  1. 使用grepl和一些正则表达式魔法来标识要返回的列名称。以下是mtcars数据的简单示例:
  2. colsToOperateOn <- grepl("mpg|cyl", colnames(mtcars))
    > head(mtcars[, colsToOperateOn], 2)
                  mpg cyl
      Mazda RX4      21   6
    Mazda RX4 Wag  21   6
    

    您需要根据需要编写复杂的正则表达式来获取所需的列。

    1. 使用which标识所需的起始列和结束列的索引,然后将其转换为序列:
    2. start <- which(colnames(mtcars) == "mpg")
      end <- which(colnames(mtcars) == "cyl")
      > head(mtcars[, start:end], 2)
                    mpg cyl
      Mazda RX4      21   6
      Mazda RX4 Wag  21   6
      

      这可能是一个糟糕的例子,因为mpgcyl彼此相邻,但它应该证明这一点。

答案 1 :(得分:2)

:不能用于字符类型。尝试先获取索引:

rowSums(county[,(which(names(county)=='H76007'):which(names(county)=='H76025'))])