我试图将人口普查数据与相当分散的数据(例如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;将我的变量设置为数字 - 尽管它们已经是整数 - 并且一切都没有结果。
任何指导?感谢。
答案 0 :(得分:3)
按列名索引data.frames时,您无法使用:
运算符。使用数值执行此操作时,它会创建一个序列:
> 2:5
[1] 2 3 4 5
然而,这并不适用于您所看到的字符数据:
> "foo":"bar"
Error in "foo":"bar" : NA/NaN argument
In addition: Warning messages:
...
那么,该怎么办?我可以想到两个选择:
grepl
和一些正则表达式魔法来标识要返回的列名称。以下是mtcars
数据的简单示例:#
colsToOperateOn <- grepl("mpg|cyl", colnames(mtcars))
> head(mtcars[, colsToOperateOn], 2)
mpg cyl
Mazda RX4 21 6
Mazda RX4 Wag 21 6
您需要根据需要编写复杂的正则表达式来获取所需的列。
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
彼此相邻,但它应该证明这一点。
答案 1 :(得分:2)
:
不能用于字符类型。尝试先获取索引:
rowSums(county[,(which(names(county)=='H76007'):which(names(county)=='H76025'))])