我在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"))
现在我要添加&#34; K2&#34;在&#34;开始&#34;之间的随机位置中的两个元素和&#34;购买&#34; /&#34;推迟&#34;。
到目前为止我的方法:选择在哪里添加&#34; K2&#34;:
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
的{{1}}可能很有用,但我无法弄清楚如何在不使用循环的情况下应用它。这个
R.utils
适用于我想要插入的第一个元素。如何将插入功能应用于我的所有列表项?
答案 0 :(得分: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)