2017-07-28 92 views
2

我有多个具有相同确切结构但内容不同的数据框/骰子。他们的名字是我能区分它们的唯一途径。目标是将它们全部合并到一个数据框中,并带有一个因子列。原始数据帧每个小时/测量都有一列,所以首先我想收集所有内容。使用其数据框名称重命名列表中的数据框列

想象列mtcars DF的5至11是我的时间列。

mt1 <- mtcars 
mt2 <- mtcars 
mt3 <- mtcars 
mt4 <- mtcars 

mtlist <- list(m1 = mt1, 
       m2 = mt2, 
       m3 = mt3, 
       m4 = mt4) 

require(tidyverse) 

mtlist_tidy <- lapply(mtlist, function(x){ 
    df <- x %>% 
    gather(exp, temp_name, 5:11) 

    return(df) 
}) 

现在我卡住了。我需要在每个DFS的与DF即M1,M2的名字重新命名内mtlist_tidy的 “temp_name” 一栏,等:

> head(mtlist_tidy$m1) 
    mpg cyl disp hp exp temp_name 
1 21.0 6 160 110 drat  3.90 
2 21.0 6 160 110 drat  3.90 
3 22.8 4 108 93 drat  3.85 
4 21.4 6 258 110 drat  3.08 
5 18.7 8 360 175 drat  3.15 
6 18.1 6 225 105 drat  2.76 

应该成为

> head(mtlist_tidy$m1) 
    mpg cyl disp hp exp  m1 
1 21.0 6 160 110 drat  3.90 
2 21.0 6 160 110 drat  3.90 
3 22.8 4 108 93 drat  3.85 
4 21.4 6 258 110 drat  3.08 
5 18.7 8 360 175 drat  3.15 
6 18.1 6 225 105 drat  2.76 

然后purrr::reduce(mtlist_tidy, full_join)会的工作,完成我的任务。

我想一定的解决方案只使用purrr和lapply跳过,但我没那么熟悉却又这个包。

+3

你知道该函数'bind_rows'有一个选项来创建使用列表项的名称是“ID”列?你的问题听起来好像这可能是有用的。 –

+0

是的!这是我需要的!我不知道这一点,谢谢。如果您将其作为答案提交,我会接受它。 – mariachi

+0

如果您喜欢,请随时自行回答。可能还有一个重复的地方 –

回答

4

一对夫妇的想法:

首先,为你当前你可以通过列表,该列表的同时名称都使用map2循环处理这个问题。然后,您可以通过gather_(用于标准评估)与列表名称一起命名新列。

map2(mtlist, names(mtlist), ~gather_(.x, "exp", .y, names(.x)[5:11])) 

purrr下一个版本将有imap作为一条捷径,通过列表循环和列表的名称。此外,tidyr的下一个版本将使用tidyevalgather_将被弃用。

其次,您可以通过使用map_df而不是lapply来保留长格式的东西。 map_df在引擎盖底部使用bind_rows,并且您可以通过参数.id为每个列表包含一个分组变量。

mtlist %>% 
    map_df(~.x %>% gather("exp", "temp_name", 5:11), .id = "name") 

要从这里将您的数据集以广泛的格式,您可以使用spread。在这个例子中需要做更多的工作,因为一些识别变量如hpdisp在多行中具有相同的值。

mtlist %>% 
    map_df(~.x %>% gather("exp", "temp_name", 5:11), .id = "name") %>% 
    group_by(name) %>% 
    mutate(rows = 1:n()) %>% 
    spread(name, temp_name) 
0

这样做吗?

lapply(mtlist_tidy, function(i) { 
    names(i)["temp_name"] <- names(mtlist)[i] }) 
2

您可能需要添加一些NSE法宝:

library(rlang) 
mtlist_tidy %>% map2(., names(.), ~rename(.x, UQ(sym(.y)) := temp_name)) 
相关问题