使用列表传递数据框的名称时出现意外结果
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))
共有 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))