在R中生成输出文件的错误

时间:2014-03-21 23:16:17

标签: r loops output

我正在尝试将输出写入符合以下格式要求的txt文件:

user_id \t brand_id , brand_id , brand_id \n 

“\ t”和“\ n”这里是插入标签空间和更改行。 现在我有2个列表,user_idbrand_id以及binary matrix C,每行对应id列表中的user_id相同的顺序,列以相同的方式对应brand_idIf C[i,j]=1,这意味着我需要在brand_id[j]的行上写出user_id[i]。 我编写了以下代码,但它生成的输出不正确。对于大多数行,"\"user_id之间的brand_id距离太宽。任何人都可以帮我纠正这个吗?

sink("result.txt")
for (i in 1:nrow(C)){
  temp <- which(C[i,]==1)
  if(length(temp)==1){
    cat(user_id[i])
    cat(" \t ")
    cat(brand_id[temp])
    cat("\n")
  }else if(length(temp)>1){
    cat(user_id[i])
    cat(" \t ")
    for (j in 1:(length(temp)-1)){
      cat(brand_id[j])
      cat(" , ")
    }
    cat(brand_id[temp[length(temp)]])
    cat("\n")
  }
}
sink()

@jbaums代码的部分输出和上面的代码就像这样

8649250      28481  
887500   4571 

似乎在user_id中减少1位数会在user_id和brand_id之间创建更少的空间。我使用VI和TXT编辑器在MAC和Windows中检查了视觉效果,相同。这是否是由我不知道的更深入的错误造成的?感谢

1 个答案:

答案 0 :(得分:1)

假设我已经了解了您的数据和您的要求,可以采用更简单的方法来实现这一目标。

通过将user_id向量指定为C的行名称,将brand_id向量指定为列名称,您可以执行以下操作:

set.seed(1)    
C <- matrix(rbinom(100, 1, 0.2), nc=10, nr=10, 
            dimnames=list(LETTERS[1:10],
                          letters[1:10]))

invisible(sapply(seq_len(nrow(C)), function(i) {
  if(sum(C[i, ]) > 0) {
    cat(rownames(C)[i], '\t', 
        paste(colnames(C)[C[i, ]==1], collapse=' , '), ' \n') 
  }
}))


A    c , e , g  
B    f , h  
D    a , j  
E    d  
F    a , h  
G    a , h  
H    b  
I    c , j  
J    g , h  

根据需要使用sink