【问题标题】:error with rowSums usng column namesrowSums 使用列名出错
【发布时间】:2013-05-02 03:00:16
【问题描述】:

我正在尝试从相当分散的数据(例如 5 岁组中的年龄变量)中分割人口普查数据,并根据汇总创建汇总变量(例如每个县 18 岁以上的所有男性)。我的解决方案是 rowSums,例如county$MalesOver18 <- rowSums(county[,c(68:87)]),其中 vars 68-87 总和为 18 岁以上的男性——工作正常。但是,对于 500 个变量,计算我的开始/结束列的顺序并不高效。

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

使用引号中的列名称运行: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

使用不带引号的列名称运行:Error in[.data.frame(county, , c(H76007:H76025)) : object 'H76007' not found

我尝试使用 na.rm 命令并将我的变量设置为数字——尽管它们已经是整数——但都没有结果。

任何指导?谢谢。

【问题讨论】:

    标签: r


    【解决方案1】:

    当按列名索引 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 数据的一个简单示例:

    #

    colsToOperateOn <- grepl("mpg|cyl", colnames(mtcars))
    > head(mtcars[, colsToOperateOn], 2)
                  mpg cyl
      Mazda RX4      21   6
    Mazda RX4 Wag  21   6
    

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

    1. 使用which 标识所需的起始列和结束列的索引,然后将它们转换为序列:

    #

    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 是相邻的,但它应该证明这一点。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 有没有办法包含多组列,例如rowSums(county[,(which(names(county)=='H76007'):which(names(county)=='H76025'))]), which(names(county) == 'H9E007'):which(names(county) == 'H9E025'))。我知道“,”不是这样做的正确方法。
      • 是的,使用c() 连接向量。所以, 很好,但将它们包含在c()
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-24
      • 1970-01-01
      相关资源
      最近更新 更多