2016-06-17 18 views
1

我有相同的結構,每件爲以下的R - 收起到一個列表

config <- NULL 

config[["secA"]] <- NULL 
config[["secA"]]$VAL <- 0 
config[["secA"]]$ARR <- c(1,2,3,4,5) 
config[["secA"]]$DF <- data.frame(matrix(c(1,5,3,8),2,2)) 

config[["secB"]] <- NULL 
config[["secB"]]$VAL <- 1 
config[["secB"]]$ARR <- c(1,3,2,4,9) 
config[["secB"]]$DF <- data.frame(matrix(c(2,6,1,9),2,2)) 

config[["secC"]] <- NULL 
config[["secC"]]$VAL <- 5 
config[["secC"]]$ARR <- c(4,2,1,5,8) 
config[["secC"]]$DF <- data.frame(matrix(c(4,2,1,7),2,2)) 

列表的矢量相同構件和我需要獲得3個矢量VALARRDF,各與所串接相應成員的元素。如

# VAL: 0,1,5 
# ARR: 1,2,3,4,5,1,3,2,4,9,4,2,1,5,8 
# DF: 1,5,3,8,2,6,1,9,4,2,1,7 

在類似的情況來看,我有我需要使用的do.callcbindlapply組合的感覺,但我不知道。有什麼建議麼?

+0

我需要用作'.C'功能的輸入 – Stefano

回答

2
config <- NULL 

config[["secA"]] <- NULL 
config[["secA"]]$VAL <- 0 
config[["secA"]]$ARR <- c(1,2,3,4,5) 
config[["secA"]]$DF <- data.frame(matrix(c(1,5,3,8),2,2)) 

config[["secB"]] <- NULL 
config[["secB"]]$VAL <- 1 
config[["secB"]]$ARR <- c(1,3,2,4,9) 
config[["secB"]]$DF <- data.frame(matrix(c(2,6,1,9),2,2)) 

config[["secC"]] <- NULL 
config[["secC"]]$VAL <- 5 
config[["secC"]]$ARR <- c(4,2,1,5,8) 
config[["secC"]]$DF <- data.frame(matrix(c(4,2,1,7),2,2)) 

sapply(names(config[[1]]), function(x) 
    unname(unlist(sapply(config, `[`, x))), USE.NAMES = TRUE) 

# $VAL 
# [1] 0 1 5 
# 
# $ARR 
# [1] 1 2 3 4 5 1 3 2 4 9 4 2 1 5 8 
# 
# $DF 
# [1] 1 5 3 8 2 6 1 9 4 2 1 7 

或者你可以使用this clist功能

遺憾的是沒有其他答案。

(l <- Reduce(clist, config)) 
# $VAL 
# [1] 0 1 5 
# 
# $ARR 
# [1] 1 2 3 4 5 1 3 2 4 9 4 2 1 5 8 
# 
# $DF 
# X1 X2 X1 X2 X1 X2 
# 1 1 3 2 1 4 1 
# 2 5 8 6 9 2 7 

它融合了數據幀和矩陣,所以你需要unlist得到矢量您想

l$DF <- unname(unlist(l$DF)) 
l 
# $VAL 
# [1] 0 1 5 
# 
# $ARR 
# [1] 1 2 3 4 5 1 3 2 4 9 4 2 1 5 8 
# 
# $DF 
# [1] 1 5 3 8 2 6 1 9 4 2 1 7 

功能

clist <- function (x, y) { 
    islist <- function(x) inherits(x, 'list') 
    '%||%' <- function(a, b) if (!is.null(a)) a else b 
    get_fun <- function(x, y) 
    switch(class(x %||% y), 
      matrix = cbind, 
      data.frame = function(x, y) 
      do.call('cbind.data.frame', Filter(Negate(is.null), list(x, y))), 
      factor = function(...) unlist(list(...)), c) 

    stopifnot(islist(x), islist(y)) 
    nn <- names(rapply(c(x, y), names, how = 'list')) 
    if (is.null(nn) || any(!nzchar(nn))) 
    stop('All non-NULL list elements should have unique names', domain = NA) 

    nn <- unique(c(names(x), names(y))) 
    z <- setNames(vector('list', length(nn)), nn) 

    for (ii in nn) 
    z[[ii]] <- if (islist(x[[ii]]) && islist(y[[ii]])) 
     Recall(x[[ii]], y[[ii]]) else 
     (get_fun(x[[ii]], y[[ii]]))(x[[ii]], y[[ii]]) 
    z 
} 
+0

好的。絕對超出我的聯盟......非常感謝!沒有這個我可以留在這裏! – Stefano

+1

@Stefano我的意思是我確信還有其他的方法,但這是我將如何做,因爲我花時間寫和測試它,再加上我知道它已經存在了 – rawr

+0

@Stefano我添加了一行應該工作得很好,如果你只需要向量 – rawr

1

另一種方法,用略少的代碼。

un_config <- unlist(config) 

un_configNAM <- names(un_config) 

vecNAM <- c("VAL", "ARR", "DF") 

for(n in vecNAM){ 
    assign(n, un_config[grepl(n, un_configNAM)]) 
} 

這將返回3個向量作爲OP請求。但是,通常將結果作爲rawr建議存儲在列表中更爲有利。您當然可以採用上述代碼,以便將結果存儲在列表中。

l <- rep(list(NA), length(vecNAM)) 

i = 1 
for(n in vecNAM){ 
    l[[i]] <- un_config[grepl(n, un_configNAM)] 
    i = i +1 
} 
+0

我試過了,但用這個我沒有得到陣列 – Stefano

+0

嗯......我只是加倍檢查,它爲我工作得很好。也許首先清理你的工作空間? –

+0

只是我沒有看到你的答案的編輯。我現在明白了:)非常感謝! – Stefano