我的数据框大约是50,000 X 200.列名是4种不同类型,末尾的数字范围是1-50(store1,price1,time1,rate1,store2,price2,time2,rate2,.. 。,store50,price50,time50,rate50)。我正在尝试根据每列的值创建虚拟变量,但是在处理循环内的列名时遇到问题。
store1 price1 time1 rate1 store2 price2 time2 rate2 ....
A 55.55 08:09 1.44 B 44.44 11:09 1.46
C 55.55 08:09 1.44 G 44.44 11:09 1.46
X 55.55 08:09 1.44 E 44.44 11:09 1.46
D 55.55 08:09 1.44 S 44.44 11:09 1.46
这是我到目前为止没有运气的尝试。
xform_data <- function(x) {
for(i in 1:50){
storeX <- (paste("store",i,sep=""))
storeX2 <- ifelse(storeX == "A", 1, 2)
x <- cbind(x, storeX2 )
}
x
}
有什么建议吗?
答案 0 :(得分:3)
以下比较名称而不是比较值:
ifelse(storeX == "A", ...
尝试:
ifelse(x[,storeX] == "A", ...
此外,所有新列都将被称为storeX2
。您可能更喜欢重命名它们:
x <- cbind(x, storeX2)
colnames(x)[length(colnames(x))] <- storeX2
(我相信有更优雅的方法可以做到。)
答案 1 :(得分:1)
@aix给出了使用循环执行此操作的正确方法,但是您可能会发现使用其他工具更快或更容易,具体取决于您希望最终结果。像sapply
和lapply
这样的函数可以用于以相同的方式处理数据帧的每一列(或数据帧的子集)。 model.matrix
函数将一步将变量转换为虚拟变量(0和1)。其他可能有用的工具包括switch
和match
。