【问题标题】:Retrieving the name of data frame to use as a prefix in column name检索数据框的名称以用作列名中的前缀
【发布时间】:2021-08-06 10:11:24
【问题描述】:

这是我数据的一小部分:

A1 <- data.frame(Cell_ID = c("M", "M", "M", "BR", "BR", "BR"), 
                 Pulse_ID = c(1, 2, 3, 1, 2, 3),  
                 x = c(45.0495, 40.044, 55.0605, 45.0495, 40.044, 35.0385)) 
A2 <- data.frame(Cell_ID = c("M", "M", "M", "BR", "BR", "BR"), 
                 Pulse_ID = c(1, 2, 3, 1, 2, 3),  
                 x = c(30.033, 45.0495, 45.0495, 45.0495, 35.0385, 45.0495))

>A1     #A2 is the same format
  Cell_ID  Pulse_ID       x
     M         1       45.0495
     M         2       40.0440
     M         3       55.0605
    BR         1       45.0495
    BR         2       40.0440
    BR         3       35.0385

wells <- list(A1, A2) 

旋转表格以使每一列都是一个新的 Cell_ID 是可以的。但我似乎无法在下面的函数中插入数据框名称作为前缀(例如 names_prefix = "A1_")。

df <- lapply(wells, function(well){
  well %>%  
  pivot_wider(names_from = Cell_ID, values_from = x, names_prefix = **WHAT DO I INSERT HERE**) 
})
final <- df %>% reduce(full_join, by = "Pulse_ID")

我认为我不能通过lapply 运行数据框,同时尝试在函数中提取数据框名称。我考虑过使用循环,但我也想不通。我有超过 100 个数据帧来运行它,所以我不能手动输入每个前缀。最终,我需要合并数据框,因此列名非常重要。

我的最终产品需要如下所示:

# A tibble: 6 x 9
  Pulse_ID  A1_M A1_BR  A2_M A2_BR  A3_M... 
     1      45.0  45.0  30.0  55.1  ...   and so on
     2      40.0  40.0  45.0  45.0  ...   
     3      55.1  35.0  45.0  30.0  ...   

有什么建议吗?谢谢!

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    您可以使用lst 函数创建一个命名列表,使用id 列将它们加入一个数据帧,并获取宽格式数据。

    library(tidyverse)
    
    lst(A1, A2)  %>%
      bind_rows(.id = 'id') %>%
      pivot_wider(names_from = c(id, Cell_ID), values_from = x)
    
    #  Pulse_ID  A1_M A1_BR  A2_M A2_BR
    #     <dbl> <dbl> <dbl> <dbl> <dbl>
    #1        1  45.0  45.0  30.0  45.0
    #2        2  40.0  40.0  45.0  35.0
    #3        3  55.1  35.0  45.0  45.0
    

    【讨论】:

      【解决方案2】:

      您可以创建一个命名列表:

      wells <- list(A1 = A1, A2 = A2) 
      

      然后加上purrr,你可以这样做:

      imap(wells,
           ~ .x %>%  
               pivot_wider(names_from = Cell_ID, 
                           values_from = x, 
                           names_prefix = paste0(.y, "_"))) %>% 
          reduce(full_join, by = "Pulse_ID")
      
        Pulse_ID  A1_M A1_BR  A2_M A2_BR
           <dbl> <dbl> <dbl> <dbl> <dbl>
      1        1  45.0  45.0  30.0  45.0
      2        2  40.0  40.0  45.0  35.0
      3        3  55.1  35.0  45.0  45.0
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-10
        • 1970-01-01
        • 1970-01-01
        • 2019-06-03
        • 1970-01-01
        • 2021-11-15
        相关资源
        最近更新 更多