我有一个包含不同数量值的元素的列表。我希望将所有a到单列和b合并到另一列。更多我想分配带有ID的新列(其中第一个a和第一个b获取id1,第二个b和第二个b获取id2 ......等等)
以下是列表示例:
# Reproducible problem
problem <- list(as.numeric(c(1:4)), as.numeric(c(25:28)), as.numeric(c(5:6)), as.numeric(c(29:30)), as.numeric(c(7:12)), as.numeric(c(31:36)))
names(problem) <- c("a", "b", "a", "b", "a", "b")
我期待的结果:
# Expected result
result <- list(as.numeric(c(1:12)), as.numeric(c(25:36)), c("id1", "id1", "id1", "id1", "id2", "id2", "id3", "id3", "id3", "id3", "id3", "id3" ))
names(result) <- c("a", "b", "id")
答案 0 :(得分:0)
假设每个对的'a','b'交替并具有相同的'length',请获取lengths
,仅使用逻辑向量的回收过滤第一个元素(c(TRUE, FALSE)
)。将最初的list
转换为data.frame
stack
,split
将'值'转换为'ind'和append
(或c
) 'id'vector
使用'i1'创建。
i1 <- lengths(problem)[c(TRUE, FALSE)]
c(with(stack(problem), split(values, ind)), id = list(rep(paste0("id", 1:3), i1)))
#$a
#[1] 1 2 3 4 5 6 7 8 9 10 11 12
#$b
#[1] 25 26 27 28 29 30 31 32 33 34 35 36
#$id
#[1] "id1" "id1" "id1" "id1" "id2" "id2" "id3" "id3" "id3" "id3" "id3" "id3"
答案 1 :(得分:0)
在a和b中使用一个长度相同的循环
result <- list(a = c(), b = c(), id = c())
i <- 1
for (j in seq(1, length(problem), 2)) {
result[[1]] <- c(result[[1]], problem[[j]])
result[[2]] <- c(result[[2]], problem[[j + 1]])
result[[3]] <- c(result[[3]], rep(paste0('id', i), length(problem[[j]])))
i <- i + 1
}