在循环中创建新列

时间:2016-04-08 19:49:47

标签: r function loops

我想为指定的数据集创建age10,age20,age30等变量。函数add_ages的输入是一个名为df的数据框,其中新变量是根据它们与现有变量年龄的关系创建的。

    i = i + 1;
00AF52C5  mov         eax,dword ptr [i]  
00AF52C8  add         eax,1  
00AF52CB  mov         dword ptr [i],eax  
    i +=1;
00AF52CE  mov         eax,dword ptr [i]  
00AF52D1  add         eax,1  
00AF52D4  mov         dword ptr [i],eax  

但是,当我运行上面的代码时,我收到以下错误:

df <- data.frame(age=sample(1:100,10,replace=T))

add_ages <- function(d){
  for(i in seq(10,100,10)){
    d[,paste0("age",i)] <<- ifelse(i>=d[,"age"] & d[,"age"]<i+10,1,0)
  }
}

add_ages(d=df)

当我将其定义为df时,我不确定我理解为什么d无法找到。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

听起来您正在尝试使用数据创建虚拟变量。

请注意,对于R中的大多数建模函数,这将在建模步骤中自动发生。这种方法的工作方式是使用model.matrix()函数。

以下是一个例子:

df&lt; - data.frame(age = sample(1:100,10,replace = T))

# Create a categorical variable using cut()
df$agegroup <- cut(df$age, breaks=seq(0, 100, by = 10))

您现在有一个带年龄组的分类变量:

head(df)
  age agegroup
1  82  (80,90]
2  79  (70,80]
3  99 (90,100]
4  12  (10,20]
5  82  (80,90]
6  66  (60,70]

转换为模型矩阵

# Create the model matrix

model.matrix(~agegroup - 1, df)
   agegroup(0,10] agegroup(10,20] agegroup(20,30] agegroup(30,40] agegroup(40,50]
1               0               0               0               0               0
2               0               0               0               0               0
3               0               0               0               0               0
4               0               1               0               0               0
5               0               0               0               0               0
6               0               0               0               0               0
7               0               0               0               0               0
8               0               1               0               0               0
9               0               0               0               0               1
10              0               0               0               0               0

答案 1 :(得分:2)

使用<-代替<<-。使用<<-分配全局范围内的事物,其中d不存在。最后,返回d

add_ages <- function(d) {
  for (i in seq(10,100,10)){
    d[,paste0("age",i)] <- ifelse(i>=d[,"age"] & d[,"age"]<i+10,1,0)
  }
  d
}
df <- add_ages(df)

编辑:

如果您真的想避免执行df <- add_ages(df),可以执行以下操作:

add_ages <- function() {
  for (i in seq(10,100,10)){
    df[,paste0("age",i)] <<- ifelse(i>=df[,"age"] & df[,"age"]<i+10,1,0)
  }
}

add_ages()

至少有两个原因我建议不要这样做。首先,这根本没有概括。制作一个能够做到这一点的函数真的没有意义,你最好在创建df之后立即使用循环,例如。

df <- data.frame(age=sample(1:100,10,replace=T))
for (i in seq(10,100,10)){
  df[,paste0("age",i)] <<- ifelse(i>=df[,"age"] & df[,"age"]<i+10,1,0)
}

其次,功能应努力避免副作用。换句话说,如果我调用一个函数,唯一被修改的对象就是我将输出保存到的地方。像这样的副作用可能看起来无害,但是如果你在一些代码中间把它写成几个函数中的一个,然后在6个月之后回到它,可能你会忘记副作用,这会导致所有各种头痛。