如何在for循环中的数据框架中创建变量?

时间:2012-10-30 22:14:22

标签: r variables for-loop

我有一个名为mydata的R数据框,其中包含具有特定年龄和特定身高的人数。所以数据框内我有变量mydata$ageto10(=十岁以下的人数),mydata$ageto20(=二十岁以下的人数)年龄分别为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命令并不意味着将变量名称分配给当前数据。

最好的方法是什么?

1 个答案:

答案 0 :(得分:6)

我认为你是另一个统计包(或许stataSAS)的难民。您无法使用分配来使用$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)

不需要循环!