2010-11-04 74 views
1

我有一个响应变量,Y,和三个因素,“factor.a”,“factor.b”数据帧,而“factor.c”我可以避免这些嵌套for循环?

我试图写一个函数,将

  1. 从数据帧中删除的列,如果因子各级是相同的

  2. 添加术语“beta.factor.x [1..N]”来的参数矢量时,有不止是一个因素的一个等级,高达5个等级。

  3. 排除参数beta.factor.b从列表[1](它是固定的)

这是我的代码。我认为它看起来不错并且运行良好,但我已经读过最好避免嵌套for循环,所以我很好奇是否有更高效的方法。

data <- data.frame(  y = c(1,2,3,4), 
        factor.a = c(1, 1, 2, 1), 
        factor.b = c(1, 2, 2, 3), 
        factor.c = c(0, 0, 0, 0)) 

model.parms <- list(factor.a = length(unique(data$factor.a)), 
        factor.b = length(unique(data$factor.b)), 
        factor.c = length(unique(data$factor.c))) 
vars <- 'beta.o' 
for (x in c('factor.a','factor.c', 'factor.b')) { 
    if(model.parms[[x]] == 1) { 
    data <- data[, -which(names(data) == x)] 
    } else { 
    m <- min(model.parms[[x]], 5) 
    for (i in 1:m) { 
     if(!i == 1 && x == 'factor.b') { 
     vars <- c(vars, paste('beta.', x, '[', i, ']', sep='')) 
     } 
    } 
    } 
} 

回答

2

你根本就不

vars <- c('beta.o', 
    paste('sd.', names(model.parms)[model.parms > 1], sep = ''), 
    paste('beta.factor.b', '[', 1 + seq_len(min(model.parms[["factor.b"]], 5) - 1), ']', sep='') 
) 
data <- data[, names(model.parms)[model.parms > 1]] 
+0

这看起来非常好,当然也指向了我简化代码的正确方向,但我注意到了两件事:首先,'x'没有在您的答案中定义(它在我的for循环中,第二我需要改变每个因子的数量 – 2010-11-05 14:30:04

+1

我改变了代码现在它应该产生与你的代码相同的结果我注意到你在原始代码中忽略了sd。的部分 – Thierry 2010-11-06 10:53:33

+0

谢谢。删除sd只是为了简化问题,你的方法很好用 – 2010-11-11 02:34:28

1

你可以经常无效嵌套循环由()需要任何循环。以你的数据帧,

> out <- by(data,data[,-1],identity) 
> out 

将让你

factor.a: 1 
factor.b: 1 
factor.c: 0 
    y factor.a factor.b factor.c 
1 1  1  1  0 
------------------------------------------------------------ 
factor.a: 2 
factor.b: 1 
factor.c: 0 
NULL 
------------------------------------------------------------ 
factor.a: 1 
factor.b: 2 
factor.c: 0 
    y factor.a factor.b factor.c 
2 2  1  2  0 
------------------------------------------------------------ 
factor.a: 2 
factor.b: 2 
factor.c: 0 
    y factor.a factor.b factor.c 
3 3  2  2  0 
------------------------------------------------------------ 
factor.a: 1 
factor.b: 3 
factor.c: 0 
    y factor.a factor.b factor.c 
4 4  1  3  0 
------------------------------------------------------------ 
factor.a: 2 
factor.b: 3 
factor.c: 0 
NULL 

如果你unclass(out),你会得到一个矩阵或模式list阵列;每个元素将包含由by()的第二个参数中指定的级别聚合的原始数据框的行。当然,您可以使用另一个在该数据框子集上运行的函数来替换功能(输出将始终是矩阵或阵列,但不一定取决于模式list,具体取决于您从函数返回的内容)。