我在R
rank=c(0,0,0,1:9,0,0,0,0,0,1:7)
group = rep(1:2,each=12)
d <- data.frame(rank, group)
d_sp <- split(d, d$group)
r <- lapply(d_sp, function(x) sample(1:tail(x$rank, n=1), 6) )
我想写下以下两行代码而不为每个列表写一行代码:
d_sp[[1]]$samp_rank1 <- d_sp[[1]]$rank %in% r[[1]]
d_sp[[2]]$samp_rank2 <- d_sp[[2]]$rank %in% r[[2]]
但是Map("%in%", d_sp$rank, r)
不能用于此目的。怎么做?
此外,如果我不需要拆分数据框并在每个组中执行相同的工作,那将非常有用。
答案 0 :(得分:2)
如果您不想制作data.frame和split,则可以尝试ave
,这类似于group_by
的{{1}} mutate
逻辑:dplyr
:
sample_rank <- ave(rank, group, FUN = function(x){
r <- sample(1:x[length(x)], 6)
x %in% r
})
答案 1 :(得分:1)
我们可以在两个列表中使用Map
,并仅提取rank
的{{1}}列,并使用d_sp
为每个列表添加新列。
cbind