2017-07-28 125 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)) 
相關問題