使用列表传递数据框的名称时出现意外结果

Unexpected results when passing the name of a dataframe using a list

共有 17 个数据框,我将它们存储在列表中:

req_dfs

"data_Apr-18" "data_Apr-19" "data_Aug-18" "data_Aug-19" "data_Dec-18" "data_Feb-19" "data_Jan-19" "data_Jul-18" "data_Jul-19" "data_Jun-18" "data_Jun-19" "data_Mar-19" "data_May-18" "data_May-19" "data_Nov-18" "data_Oct-18" "data_Sep-18"

当我向 return melt 数据帧写命令时,我得到了想要的结果,因为我只传递了一个数据帧,即

nec_col <-c("ID","Code","Name","Last Files Processed Date","Last Report Sent Date")
melt_data <- melt(`data_Apr-18`,id.vars = nec_col)

我得到了想要的结果:

melt_data 

    ID      Code           Name  Last Files Processed Date  Last Report Sent Date   Variable     Value
    3498    000199~3498    H1          30/7/2019                   31/7/2019        1-Apr-19      DONE
    3343    000225~3343    H2          27/6/2018                   28/6/2018        1-Apr-19    NOTEXT
    2117    000279~2117    H3          31/7/2019                   1/8/2019         1-Apr-19    DONE
    184     001888         H4          NA                          NA               1-Apr-19    NOTEXT
    2576    0037811~2576   H5          NA                          NA               1-Apr-19    NOTEXT
    3291    003929~3291    H6          2/10/2018                   3/10/2018        1-Apr-19    NOTEXT
    3497    004434~3497    H7          30/7/2019                   31/7/2019        1-Apr-19    NOTEXT
.                       
.                       
.                       
.                       
.                       
.                       
.                       
    3497    004434~3497 H7  30/7/2019       31/7/2019       3-Apr-19    NOTEXT

我写了一个循环来对每个数据帧执行熔化,然后执行 rbind。

for(i in req_dfs)
{

  nec_col <-c("ID","Code","Name","Last Files Processed Date","Last Report Sent Date")

  melt_data <- melt(i,id.vars = nec_col)

  melt_final <- rbind(melt_final,melt_data)

  print(paste0("finished processing: ", i))

}

此循环 return 产生意外结果:

data_Apr-18
data_Apr-19
data_Aug-18
data_Aug-19
data_Dec-18
data_Feb-19
data_Jan-19
data_Jul-18
data_Jul-19
data_Jun-18
data_Jun-19
data_Mar-19
data_May-18
data_May-19
data_Nov-18
data_Oct-18
data_Sep-18

我不知道如何将数据框传递给循环中使用的 melt 函数。这可能是一个简单的问题,但在过去的 3 个小时里,我一直在努力解决这个问题,但哪儿也没去。非常感谢任何帮助。

一个数据帧的样本数据data_Apr-18:

ID       Code           Name    Last File Processed Last report Sent   1-Apr-19 2-Apr-19    3-Apr-19
3498    000199~3498     H1           30/7/2019        31/7/2019     DONE DONE   DONE    
3343    000225~3343     H2           27/6/2018        28/6/2018 NOTEXT  NOTEXT  NOTEXT
2117    000279~2117     H3           31/7/2019        1/8/2019  NOTEXT  DONE    DONE
184     001888          H4           NA               NA    NOTEXT  NOTEXT  DONE
2576    0037811~2576    H5           NA               NA    NOTEXT  NOTEXT  DONE
3291    003929~3291     H6           2/10/2018        3/10/2018 NOTEXT  NOTEXT  NOTEXT
3497    004434~3497     H7           30/7/2019        31/7/2019 NOTEXT  DONE    NOTEXT

以防万一你不理解我附上图片的示例数据

我认为你在 req_dfs 中的只是数据帧的名称,你可以使用 mget 将它们作为列表,然后使用 lapply 循环每个和 melt 将其转换为长格式并使用 rbindlist 将所有数据绑定到一个数据帧中。

library(data.table)
rbindlist(lapply(mget(req_dfs), melt, id.vars = nec_col))

或者如果您想使用 tidyverse,我们可以使用 map_df/map_dfr 以及 gather

library(tidyverse)
map_df(mget(req_dfs),~gather(., key, value, -nec_col))