2015-06-01 19 views
1

我有如下一個矢量呼叫ID:不能在一個對象持有的for循環的結果中的R

id<-c("US_01_01", "US_01_02", "US_01_03", "UK_02_01", "UK_02_02", "UK_02_03", "CA_03_01", "CA_03_02", "CA_03_03") 

我想在下面的格式輸出保存到一個對象調用OBJ:

US 01 01 
US 01 02 
US 01 03 
UK 02 01 
UK 02 02 
UK 02 03 
CA 03 01 
CA 03 02 
CA 03 03 

以下是我的代碼:

sp<-strsplit(id,"_") 

sp<-as.array(sp) 

obj<-vector("list",dim(sp)) 

for (i in 1:dim(sp)){ 
    obj[[i]] <- cat(sprintf("%s %s %s\n", sp[[i]][1], sp[[i]][2], sp[[i]][3])) 
} 

不過,我不知道爲什麼輸出不能被保存在obj對象。

謝謝你的幫忙!

+0

'cat'打印到控制檯,你不能從'cat'輸出 –

回答

2

cat沒有返回值。擺脫它......

for (i in 1:dim(sp)){ 
    obj[[i]] <- sprintf("%s %s %s\n", sp[[i]][1], sp[[i]][2], sp[[i]][3]) 
} 

現在我們可以附加物品放在一起:

obj_full <- do.call(paste0,obj) 

你可以cat,任何時候你想:

cat(obj_full) 
# US 01 01 
# US 01 02 
# US 01 03 
# UK 02 01 
# UK 02 02 
# UK 02 03 
# CA 03 01 
# CA 03 02 
# CA 03 03 

當然,如果你也想在循環過程中使用cat,你可以爲其添加另一行。


查找文檔。幫助頁面上的「值」部分?cat解釋說它不會返回任何內容。本部分有時會被忽略,所以也值得回顧一下「描述」部分。

+0

可能想要刪除sprintf()命令內的新行「\ n」。 – untitled

+0

@untitled爲什麼?當粘貼時,它可以用作分隔符,但如果沒有它,所有內容都在一行上。 – Frank

+0

當我跑了它,似乎並不重要,如果它在那裏或沒有。 – untitled

1

試試這個:

matrix(sapply(strsplit(id,"_"),paste,collapse=" "),ncol=1) 

#output 
     [,1]  
[1,] "US 01 01" 
[2,] "US 01 02" 
[3,] "US 01 03" 
[4,] "UK 02 01" 
[5,] "UK 02 02" 
[6,] "UK 02 03" 
[7,] "CA 03 01" 
[8,] "CA 03 02" 
[9,] "CA 03 03" 
+0

由於保存到一個對象,以你的想法,我有想出另一種方法。 (1),sp [[i]] [1],sp [[i]] [1] 2],sp [[i]] [3]))) 上面的sp在轉換爲數組之前是sp – Patrick

2

嘗試read.table

read.table(text=id, sep='_', colClasses=rep('character',3)) 
# V1 V2 V3 
#1 US 01 01 
#2 US 01 02 
#3 US 01 03 
#4 UK 02 01 
#5 UK 02 02 
#6 UK 02 03 
#7 CA 03 01 
#8 CA 03 02 
#9 CA 03 03 

或者

library(splitstackshape) 
cSplit(as.data.frame(id), 'id', sep='_', type.convert=FALSE)