【问题标题】:Select first row from multiple dataframe and bind从多个数据框中选择第一行并绑定
【发布时间】:2018-06-17 11:02:45
【问题描述】:

我将三个数据框组合在一个列表中

d1 <- data.frame(y1 = c(1, 2, 3), y2 = c(4, 5, 6))
d2 <- data.frame(y1 = c(3, 2, 1), y2 = c(6, 5, 4))
d3 <- data.frame(y1 = c(5, 7, 8),y2 = c(6, 4, 2))
my.list <- list(d1, d2,d3)

我想提取列表中每个元素的第一行,将它们逐行绑定并保存为 csv 文件。

例如,在上面的例子中,我想从d1d2d3中提取第一行

row1.d1 <- c(1,4)
row1.d2 <- c(3,6)
row1.d3 <- c(5,6)

将它们绑定在一起

dat <- rbind(row1.d1,row1.d2,row1.d3)
dat     

row1.d1    1    4
row1.d2    3    6
row1.d3    5    6

然后对所有行重复。

如果我有一个向量列表,我找到了一种方法,

 A=list()
 A[[1]]=c(1,2)
 A[[2]]=c(3,4)
 A[[3]]=c(5,6)

 sapply(A,'[[',1)

但是对于数据框,我不知道该怎么做。

【问题讨论】:

  • 另外,t(sapply(my.list, head, 1))

标签: r list dataframe apply


【解决方案1】:

我们需要在1之后使用,

t(sapply(my.list, `[`, 1, ))

【讨论】:

    【解决方案2】:

    另一种方法如下。您遍历my.list 中的每个数据框并获得lapply() 的第一行。然后你绑定结果。

    do.call(rbind, (lapply(my.list, function(x) x[1,])))
    
    #  y1 y2
    #1  1  4
    #2  3  6
    #3  5  6
    

    【讨论】:

      【解决方案3】:

      tidyverse/FP 解决方案如下。我添加了iddf 以分别保留有关行号和来源的信息。

      # your data
      d1 <- data.frame(y1 = c(1, 2, 3), y2 = c(4, 5, 6))
      d2 <- data.frame(y1 = c(3, 2, 1), y2 = c(6, 5, 4))
      d3 <- data.frame(y1 = c(5, 7, 8),y2 = c(6, 4, 2))
      my.list <- list(d1, d2,d3)
      
      
      # tidyverse/ FP solution
      library(dplyr)
      library(purrr)
      library(readr)
      
      map_df(.x = seq(1:3),
             .f = function(x) bind_rows(my.list[x]) %>%
                 mutate(id = row_number(),
                        df = x)) %>%
        arrange(id) %>%
        #select(-id, -df) %>% # uncomment if you want to lose row num and source
        write_csv(path = 'yourfile.csv')
      

      【讨论】:

      • 我接受这个答案,因为这允许我绑定所有行。谢谢
      猜你喜欢
      • 2012-01-07
      • 1970-01-01
      • 2016-10-11
      • 1970-01-01
      • 2019-12-19
      • 1970-01-01
      • 2019-03-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多