2016-05-23 89 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)