我正在尝试将输出写入符合以下格式要求的txt文件:
user_id \t brand_id , brand_id , brand_id \n
“\ t”和“\ n”这里是插入标签空间和更改行。
现在我有2
个列表,user_id
和brand_id
以及binary matrix C
,每行对应id
列表中的user_id
相同的顺序,列以相同的方式对应brand_id
。 If 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中检查了视觉效果,相同。这是否是由我不知道的更深入的错误造成的?感谢
答案 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
。