R处理for循环中的列名

时间:2011-12-22 16:12:47

标签: r

我的数据框大约是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    
}

有什么建议吗?

2 个答案:

答案 0 :(得分:3)

以下比较名称而不是比较值:

ifelse(storeX  == "A", ...

尝试:

ifelse(x[,storeX]  == "A", ...

此外,所有新列都将被称为storeX2。您可能更喜欢重命名它们:

x <- cbind(x, storeX2)
colnames(x)[length(colnames(x))] <- storeX2

(我相信有更优雅的方法可以做到。)

答案 1 :(得分:1)

@aix给出了使用循环执行此操作的正确方法,但是您可能会发现使用其他工具更快或更容易,具体取决于您希望最终结果。像sapplylapply这样的函数可以用于以相同的方式处理数据帧的每一列(或数据帧的子集)。 model.matrix函数将一步将变量转换为虚拟变量(0和1)。其他可能有用的工具包括switchmatch

相关问题