2017-10-18 104 views
1

數據:在數據的列表創建列表名稱列幀

vec.1 <- c(1, 2) 
vec.2 <- c(2, 3) 
df.1 <- data.frame(vec.1, vec.2) 
df.2 <- data.frame(vec.2, vec.1) 
my_list <- list(df.1, df.2) 

我希望創建從該列表中他們來自列表數列表示沿每個數據幀 序列。

打印數據列表:

[[1]] 
    vec.1 vec.2 
1  1  2 
2  2  3 

[[2]] 
    vec.2 vec.1 
1  2  1 
2  3  2 

代碼:

funk <- function(x){ 
    index <- seq(x) 
    linenum <- 
    cbind(x,index,linenum) 
} 

new.dat <- lapply(my_list, funk) 

預期輸出:

[[1]] 
    vec.1 vec.2 index listnum 
1  1  2  1 1 
2  2  3  2 1 

[[2]] 
    vec.2 vec.1 index listnum 
1  2  1  1 2 
2  3  2  2 2 

目前我面臨的困難,創造這個listnum列。

回答

2

我們可以使用transform通過的list元素,然後根據對「my_list」的length序列的「LISTNUM」循環創建順序列與Map

Map(cbind, lapply(my_list, function(x) 
     transform(x, index = seq_len(nrow(x)))), listnum = seq_len(length(my_list))) 

或者使用tidyverse

library(dplyr) 
library(purrr) 
map2(my_list, seq_len(length(my_list)), ~mutate(.x, index = row_number(), listnum = .y)) 
#[[1]] 
# vec.1 vec.2 index listnum 
#1  1  2  1  1 
#2  2  3  2  1 

#[[2]] 
# vec.2 vec.1 index listnum 
#1  2  1  1  2 
#2  3  2  2  2 
+0

我相信雖然所有其他解決方案確實解決了這個問題。但是,我發現tidyverse解決方案非常有用。 – Shoaibkhanz

+0

但是,有一個問題沒有解決,那就是如果包含數據框的列表有一些'NULL'列表索引。我實施的解決方案涉及確定哪些索引具有NULL,然後用僞數據幀替換它們。 – Shoaibkhanz

+0

@Shoaibkhanz目前尚不清楚具體情況。但是,如果有空元素,你可以用'if/else'條件,即'〜if(is.null(.x))NA else mutate(.x,index = row_number(),listnum = ..y) )' – akrun

1

您可以修改你的函數是這樣的:

funk <- function(i,x){ 
index <- seq(x[[i]]) 
listnum <- i 
cbind(x[[i]],index,listnum) 
} 

new.dat <- lapply(1:length(my_list), funk,my_list) 

#>new.dat 
#[[1]] 
# vec.1 vec.2 index listnum 
#1  1  2  1  1 
#2  2  3  2  1 

#[[2]] 
# vec.2 vec.1 index listnum 
#1  2  1  1  2 
#2  3  2  2  2  
1

這是做你是什麼後

new_list <- lapply(1:length(my_list), function(x) 
      my_list[[x]] <- cbind(my_list[[x]][1], 
         my_list[[x]][2], 
         index = 1:length(my_list[[x]][[2]]), 
         listnum = rep(x, length(my_list[[x]][2])))) 

new_list 
# [[1]] 
# vec.1 vec.2 index listnum 
# 1  1  2  1  1 
# 2  2  3  2  1 

# [[2]] 
# vec.2 vec.1 index listnum 
# 1  2  1  1  2 
# 2  3  2  2  2 

就意識到了這一點,而不必創建新的數據集來完成。一旦運行,my_list包含所需的結果。

lapply(1:length(my_list), function(x) 
       my_list[[x]] <<- cbind(my_list[[x]][1], 
          my_list[[x]][2], 
          index = 1:length(my_list[[x]][[2]]), 
          listnum = rep(x, length(my_list[[x]][2]))))