2017-08-14 91 views
-1
x<-as.factor(c("ds","sd","ds","dd")) 
fn<-function(x){ 
results<-list(a=c(2,3,4),b=c("3","d")) 
for(i in 1:length(levels(x))){ 
results<-list(results, 
assign(paste("g", i, sep = ""), levels(x)[i])) 
    } 
return(results) 
} 
fn(x) 
[[1]] 
[[1]][[1]] 
[[1]][[1]][[1]] 
[[1]][[1]][[1]]$a 
[1] 2 3 4 

[[1]][[1]][[1]]$b 
[1] "3" "d" 


[[1]][[1]][[2]] 
[1] "dd" 


[[1]][[2]] 
[1] "ds" 


[[2]] 
[1] "sd" 

以上輸出是不是我想要的。我希望它如下面的輸出瞭如何在一個創建變量名的for循環

$a 
[1] 2 3 4 
$b 
"3" "d" 
$g1 
"dd" 
$g2 
"ds" 
$g3 
"sd" 

輸出中列表的名稱是不正確的。

回答

0

我不知道的理由是你的問題的背後,但這可以在沒有任何for循環來完成。請嘗試

x <- as.factor(c("ds", "sd", "ds", "dd")) 
results <- list(a = c(2, 3, 4), b = c("3", "d")) 
results <- c(results, setNames(as.list(levels(x)), paste0("g", seq_len(nlevels(x))))) 

results 

重建預期的結果:

$a 
[1] 2 3 4 

$b 
[1] "3" "d" 

$g1 
[1] "dd" 

$g2 
[1] "ds" 

$g3 
[1] "sd" 

x水平從矢量裹挾到列表中。然後使用setNames()重命名列表元素。的名稱被給定爲通過將其粘貼在一起g創建的字符向量和從1到水平的x數目數字的序列。最後,這個新的列表被添加到現有的result列表。

+0

它必須是在一個循環中,因爲它是一個函數fn(),和x對象是未知的。這個因素的水平可以是任何數字。在x的等級數量爲3的情況下,但它可以是4,5或6.然後循環是強制性的,以適應任何數量的等級。 –

+0

你說得對,我不應該硬編碼的級別數。請參閱我的更新版本,可以與任何級別的工作 - 仍然沒有「for」循環。 – Uwe