我有一个dataframe
,其中一个字段包含长度不同的列表。我想将该字段中列表的每个元素提取到自己的字段中,以便我可以将结果收集到一个长dataframe
中,每个id对应一个列表元素。
以下是一个示例dataframe
:
dat <- structure(list(id = c("509935", "727889", "864607", "1234243",
"1020959", "221975"), some_date = c("2/09/1967", "28/04/1976",
"22/12/2017", "7/02/2006", "10/03/2019", "21/10/1935"), df_list = list(
"018084131", c("062197171", "062171593"), c("064601923",
"068994009", "069831651"), c("071141584", "073129537"), c("061498574",
"065859718", "067251995", "069447806"), "064623976")), class = c("tbl_df",
"tbl", "data.frame"), row.names = c(NA, -6L))
我已经写了一些代码来实现我想要的最终结果,但是我没有以DRY的方式完成。以下是我尝试过的内容。
res_n
是以下函数:
res_n <- function(field, n) {
field[n]
}
dat <- dat %>% mutate(res1 = map(df_list, res_n, 1))
dat <- dat %>% mutate(res2 = map(df_list, res_n, 2))
dat <- dat %>% mutate(res3 = map(df_list, res_n, 3))
这将返回一个数据框,其中df_list
中的三个列表元素将分别位于它们自己的列中。
有了这个,我可以实现我想要的,并生成最终的dataframe
结果,如下所示:
dat_final <- gather(dat, test, labno, -df_list, -some_date, -id) %>%
select(-df_list) %>%
mutate(labno = as.integer(labno)) %>%
filter(!is.na(labno))
为避免DRY方法,我使用了for循环来尝试消除重复的代码。然而,我现在还无法以所需的方式使其正常工作,以达到最终目标。以下是我尝试的for循环代码。
for (i in 3) {
dat %>% mutate(paste(res, i, sep = '_') = map(results, res_n, i)) }
有人能帮我优化代码,以消除生成结果的重复行吗?请。