2017-02-03 67 views
3

我知道有許多有關的問題在這裏,但我正在尋找一個嗚嗚聲解決方案,請不要從申請名單函數或cbind/rbdind(我想借此機會更好地瞭解嗚嗚聲)。添加新變量到數據幀列表與purrr和mutate()從dplyr

我有一個數據框的列表,我想添加一個新的列到列表中的每個數據幀。該列的值將是數據框的名稱,即列表中每個元素的名稱。

還有類似here,但它涉及到使用函數和mutate_each(),而我只需要mutate()

爲了讓你列表(稱爲comentarios)的想法,這裏是str()第一要素上的第一行:

> str(comentarios[1]) 
List of 1 
$ 166860353356903_661400323902901:'data.frame': 13 obs. of 7 variables: 

所以我想我的新變量包含在166860353356903_661400323902901 13線結果作爲每個數據幀的ID。

我試圖爲:

dff <- map_df(comentarios, 
       ~ mutate(ID = names(comentarios)), 
       .id = "Group" 
      ) 

然而,mutate()爲了需要數據幀的名字的工作:

Error in mutate_(.data, .dots = lazyeval::lazy_dots(...)) : 
    argument ".data" is missing, with no default 

它沒有意義擺在每一個名字,我會偏離循環領域,並失去嗚呼(和R,更普遍)的優勢。如果列表較小,我會使用reshape::merge_all(),但它有2000多個元素。預先感謝您的幫助。

編輯:一些數據來使問題重現的,按照alistaire的評論

# install.packages("tidyverse") 
library(tidyverse) 
df <- data_frame(one = rep("hey", 10), two = seq(1:10), etc = "etc") 

list_df <- list(df, df, df, df, df) 
names(list_df) <- c("first", "second", "third", "fourth", "fifth") 
dfs <- map_df(list_df, 
       ~ mutate(id = names(list_df)), 
       .id = "Group" 
      ) 
+0

你需要讓你的榜樣[重複性(http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example#5963610)通過添加數據。 – alistaire

+0

在這裏,我不認爲這是必要的,alistaire,這是一個關於語法的問題,而不是任何事情,正如傑克的答案所示。 – RobertMc

+2

[It always necessary](http://stackoverflow.com/help/mcve),否則問題將被關閉。 [問] – alistaire

回答

7

您的問題是,你有,當你不使用與管道變異明確的數據提供參考。要做到這一點,我建議使用map2_df

dff <- map2_df(comentarios, names(comentarios), ~ mutate(.x, ID = .y)) 
+0

很好,謝謝傑克。我不會假裝對我來說很直觀,但它完美地運作。 – RobertMc

+0

這只是兩個參數的映射。第一個參數是'.x'數據框列表,第二個是'.y',它是數據框名稱列表。 –

+0

當然,但我不會認爲我可以這樣做,這就是我的意思。這就是爲什麼我要求一個嗚呼的答案,因爲我想更好地瞭解這個包。再次感謝你的幫助。 – RobertMc

0

使用OP的數據答案是

library(tidyverse) 
df <- data_frame(one = rep("hey", 10), two = seq(1:10), etc = "etc") 

list_df <- list(df, df, df, df, df) 
dfnames <- c("first", "second", "third", "fourth", "fifth") 

dfs <- list_df %>% map2_df(dfnames,~mutate(.x,name=.y))