4

我有一个 R 数据框mydata,其中包含特定年龄和特定身高的人数。因此,在数据框中,我有变量mydata$ageto10(= 10 岁以下的人数)、mydata$ageto20(= 20 岁以下的人数)等等,年龄分别为 35、42 和 65 岁。同样如此对于高度(以及其他几个变量)。

我想创建新变量,这些变量指的是年龄范围 10 到 25、年龄范围 25 到 35、35 到 42 和 42 到 65 内的人数。所以对于第一种情况,我想做:

mydata$age10to25 <- mydata$ageto25 - mydata$ageto10

这可行,但我想在所有范围内执行此操作,并对高度和其他变量执行相同操作。一定有比复制粘贴这 40 次并手动更改变量名更简单的方法!:)

我认为它应该是这样的:

for (i in c("age", "height"))
{
  for (k in c(10,20,35,42, 65))
  {
  assign(paste("mydata$", i, k, "to", <<next k here>>, sep=""), get(paste("mydata$", i, <<next k here>>, , sep="")) - get(paste("mydata$", i, k, , sep=""))
  }
}

但显然这不起作用(即使我手动填写 k ,似乎该assign命令也不适用于将变量名称分配给当前数据。

最好的方法是什么?

4

1 回答 1

6

我假设您是来自另一个统计数据包的难民(stata也许是 或SAS)。您不能使用 assign 分配给使用$and的列paste。一般来说,如果您正在使用assign标准任务,您正在做一些不习惯的事情R,或者有更好的解决方案。

就像是

lower <- c(10,25,35,42)
upper <- c(25,35,42,65)

# create the differences
newData <-   myData[,paste0('ageto',upper)] - myData[, paste0('ageto',lower)]
# name them with valid names (not starting with numbers
names(newData) <- paste0('from',lower,'to',upper)
# add as columns to the original
myData <- cbind(myData, newData)

无需循环!

于 2012-10-30T22:25:43.603 回答