2016-11-17 39 views
1

我有一個列表中有不同數量的值的幾個元素。我希望將所有a合併爲單列,將b合併到另一列。進一步更我想與ID分配新的列(其中,第一a和第一B獲得ID1,第二和第二B獲得ID2 ...等)追加/合併列表元素和分配ID列

這裏是一個列表的示例:

# 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

假設「A」,「b」,交替並且具有用於每對相同的「長度」,使用得到lengths,過濾器只有第一元件邏輯向量的回收(c(TRUE, FALSE))。將初始list轉換爲data.frame,stack,split將'values'與'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" 
0

使用循環假設在一個相同的長度和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     
}