追加/合并List元素并分配ID列

时间:2016-11-17 11:05:14

标签: r list

我有一个包含不同数量值的元素的列表。我希望将所有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")

2 个答案:

答案 0 :(得分:0)

假设每个对的'a','b'交替并具有相同的'length',请获取lengths,仅使用逻辑向量的回收过滤第一个元素(c(TRUE, FALSE) )。将最初的list转换为data.frame stacksplit将'值'转换为'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                 
}