2017-10-18 83 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]))))