1

我正在尝试从相当分散的数据(例如 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 错误之一:

在引号中运行 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 命令并将我的变量设置为数字——尽管它们已经是整数——但都没有结果。

有什么指导吗?谢谢。

4

2 回答 2

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数据示例:

#

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

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

于 2013-05-02T03:11:31.227 回答
2

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

rowSums(county[,(which(names(county)=='H76007'):which(names(county)=='H76025'))])
于 2013-05-02T03:18:17.533 回答