我想为指定的数据集创建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无法找到。有什么想法吗?
答案 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个月之后回到它,可能你会忘记副作用,这会导致所有各种头痛。