2016-05-23 95 views
1

我有R中的列表:在隨機位置的列表添加字符元素R中

cls <- list(S1 = c("Start", "K1", "K2", "K1", "Buy"), 
     S2 = c("Start", "K1", "K3", "K3", "K2", "Defer"), 
     S3 = c("Start", "K1", "K2", "K2", "K3", "Defer"), 
     S4 = c("Start", "K1", "K3", "K3", "K1", "Defer")) 

現在我想「K2」添加到兩個元素在「開始」之間的隨機位置和「購買「/」 推遲」。

我的做法至今:選擇行裏添加了「K2」:

set.seed(1234) 
idx <- sample(4, 2) 
[1] 1 2 

所以我想在1線插入和2.要確定的位置,我這樣做:

a <- sapply(cls, length) 
set.seed(1234) 
lapply(a, FUN=function(x) x-sample(1:x-1, 1)) 
$`1` 
[1] 4 

$`2` 
[1] 2 

所以,現在我有一個列表添加(1和2)中的元素以及這些行(4和2)中的哪個位置的行。

我發現insert來自包R.utils可能是有用的,但我不知道如何應用它,而不使用循環。 This

x <- insert(cls[[1]], ats=c(4), values="K2") 

適用於我想要插入的第一個元素。如何將插入功能應用於我的所有列表項目?

回答

1

我想你幾乎就在那裏 - 它只是需要一點點重新安排你已經擁有的作品。而不是採樣的所有位置,然後在每一個位置的採樣的位置,然後插入,執行採樣和爲每個位置在一個步驟中插入:

randinsert <- function(z) { 
    pos <- sample(2:(length(z)-1),size=1) 
    return(R.utils::insert(z,ats=pos, values="K2")) 
} 

現在lapply()此功能所選擇的位置:

cls[idx] <- lapply(cls[idx],randinsert)