【问题标题】:Loop through list of data frames and take every n columns to create new data frame循环遍历数据框列表并取每 n 列创建新的数据框
【发布时间】:2023-02-04 23:19:51
【问题描述】:

我目前有一个数据框列表,想遍历每个列表以抓取每十列并将它们放在一个新的数据框中。澄清一下,我想通过第一个数据框,抓取 10 列,在新数据框中将这些列设为 1:10,然后转到下一个,抓取 10 列,并在新数据框中将它们设为 11:20 .我想继续执行此过程,直到我遍历每个数据框列表并完成列表。

我试过以下:

a1<-rnorm(100)
a2<-rnorm(100)
b1<-rnorm(100)
b2<-rnorm(100)
c1<-rnorm(100)
c2<-rnorm(100)

dataframe_list <- vector("list", 5)
for (i in seq_along(dataframe_list)) {
  dataframe_list[[i]] <- rbind(a1,a2,b1,b2,c1,c2)
}

new_df_list <- list()
j = 1:10
while (max(j) < 101) {
  for (i in seq_along(dataframe_list)) {
    new_df[,j] <- dataframe_list[[i]][,j]
    new_df_list[[i]]<- new_df
  }
  j = j + 10
}

但我认为这只是用列表中接下来的十列替换了十列。

提前致谢。

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    为此,我们可以使用 purrr 包中的 map 函数。然后我们使用dplyr包中的bind_cols

    library(purrr)
    library(dplyr)
    
    my_df <- map(dataframe_list,~(.x %>% as_tibble() %>% 
                           select(1:10))) %>% 
      bind_cols() %>% 
      rename_with(., ~paste0("col", 1:100))
    
    # A tibble: 6 × 50
        col1   col2   col3   col4   col5    col6   col7    col8   col9  col10  col11  col12  col13  col14  col15   col16
       <dbl>  <dbl>  <dbl>  <dbl>  <dbl>   <dbl>  <dbl>   <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>   <dbl>
    1 -1.21   1.27   0.702  1.32  -1.14  -0.194  -0.706  0.916   0.450  0.767 -1.21   1.27   0.702  1.32  -1.14  -0.194 
    2 -0.473  1.67   1.26  -0.177 -0.757 -0.308  -0.678 -0.844   0.705  0.301 -0.473  1.67   1.26  -0.177 -0.757 -0.308 
    3  0.443  2.02  -2.62   1.24  -1.13  -0.312  -0.190  1.05   -0.552  1.53   0.443  2.02  -2.62   1.24  -1.13  -0.312 
    4  1.28  -0.525 -1.09  -1.64   0.326 -0.570   0.986 -0.620   0.616 -0.168  1.28  -0.525 -1.09  -1.64   0.326 -0.570 
    5  0.609 -0.102 -2.40  -1.32   0.818 -0.0271 -0.804  0.0921  0.759  0.211  0.609 -0.102 -2.40  -1.32   0.818 -0.0271
    6  0.274 -0.830  0.381  0.343  0.330  0.278   0.726  1.67   -0.318  1.26   0.274 -0.830  0.381  0.343  0.330  0.278 
    # … with 34 more variables: col17 <dbl>, col18 <dbl>, col19 <dbl>, col20 <dbl>, col21 <dbl>, col22 <dbl>, col23 <dbl>,
    #   col24 <dbl>, col25 <dbl>, col26 <dbl>, col27 <dbl>, col28 <dbl>, col29 <dbl>, col30 <dbl>, col31 <dbl>,
    #   col32 <dbl>, col33 <dbl>, col34 <dbl>, col35 <dbl>, col36 <dbl>, col37 <dbl>, col38 <dbl>, col39 <dbl>,
    #   col40 <dbl>, col41 <dbl>, col42 <dbl>, col43 <dbl>, col44 <dbl>, col45 <dbl>, col46 <dbl>, col47 <dbl>,
    #   col48 <dbl>, col49 <dbl>, col50 <dbl>
    # ℹ Use `colnames()` to see all variable names
    

    【讨论】:

    • 使用 map 获得一根管道的不错选择!
    • 谢谢!我能够将其置于循环中并重复该过程,然后组合所有数据帧。
    【解决方案2】:

    一个选项可以是首先使用 lapply 选择列表中每个数据框的前十列保存为列表。之后,您可以使用 dplyr 中的 bind_cols 将数据帧合并为一个数据帧。这是一些可重现的代码:

    library(dplyr)
    set.seed(7) # reproducibility
    df1 <- data.frame(replicate(20,sample(0:1,5,rep=TRUE)))
    df2 <- data.frame(replicate(20,sample(0:1,5,rep=TRUE)))
    df3 <- data.frame(replicate(20,sample(0:1,5,rep=TRUE)))
    l <- list(df1, df2, df3)
    
    df_filtered <- lapply(l, (x) x[,1:10])
    df_combined <- bind_cols(df_filtered)
    
    df_combined  
    #>   X1...1 X2...2 X3...3 X4...4 X5...5 X6...6 X7...7 X8...8 X9...9 X10...10
    #> 1      1      1      1      0      0      0      0      0      0        1
    #> 2      0      0      0      1      1      1      1      1      1        1
    #> 3      0      1      1      0      1      1      0      1      1        0
    #> 4      1      1      1      1      1      1      1      1      0        0
    #> 5      0      1      1      1      0      0      1      1      0        0
    #>   X1...11 X2...12 X3...13 X4...14 X5...15 X6...16 X7...17 X8...18 X9...19
    #> 1       0       1       0       1       0       1       0       1       1
    #> 2       0       1       1       0       1       0       1       1       1
    #> 3       1       1       0       0       1       1       1       0       0
    #> 4       1       0       1       0       1       0       1       1       1
    #> 5       1       0       0       1       0       0       0       1       0
    #>   X10...20 X1...21 X2...22 X3...23 X4...24 X5...25 X6...26 X7...27 X8...28
    #> 1        1       1       1       1       0       0       0       0       1
    #> 2        0       0       0       0       1       0       1       1       0
    #> 3        0       1       0       1       0       0       1       0       0
    #> 4        1       0       1       1       1       1       1       1       1
    #> 5        0       0       1       0       1       0       1       0       1
    #>   X9...29 X10...30
    #> 1       0        1
    #> 2       1        0
    #> 3       0        0
    #> 4       0        0
    #> 5       1        1
    

    创建于 2023-02-04 reprex v2.0.2

    【讨论】:

    • 谢谢,这似乎适用于抓住前 10 列,但是有没有办法移动到接下来的 10 列并做同样的事情?对于您的示例,最终以一个总计 60 列的数据框结束。还是需要 loop 才能完成?
    猜你喜欢
    • 2021-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-29
    • 1970-01-01
    • 1970-01-01
    • 2016-11-16
    • 2021-04-27
    相关资源
    最近更新 更多