2017-01-22 52 views
2

我輸入dataframes BerryOrange組合幾個data.frames成一個(每天保持rownames)

Berry = structure(list(Name = c("ACT", "ACTION", "ACTIVISM", "ACTS", 
"ADDICTION", "ADVANCE"), freq = c(2L, 2L, 1L, 1L, 1L, 1L)), .Names = c("Name", 
"freq"), row.names = c(NA, 6L), class = "data.frame") 

Orange = structure(list(Name = c("ACHIEVE", "ACROSS", "ACT", "ACTION", 
"ADVANCE", "ADVANCING"), freq = c(1L, 3L, 1L, 1L, 1L, 1L)), .Names = c("Name", 
"freq"), row.names = c(NA, 6L), class = "data.frame") 

運行下面的操作會給我想要的output

output = t(merge(Berry,Orange, by = "Name", all = TRUE)) 
rownames(output) = c("","Berry","Orange") 
colnames(output) = output[1,] 
output = output[2:3,] 
output = data.frame(output) 

不過,現在我必須從創建output類似於BerryOrange的數據幀。由於merge似乎只能同時使用兩個data.frame,所以我不確定最適合我的是什麼。我嘗試了rbind.fill,它保留了值但丟失了Names。我發現thisthis,但無法自行找出解決方案。

這裏是爲了提供一個可重複的例子

Apple = structure(list(Name = c("ABIDING", "ABLE", "ABROAD", "ACROSS", 
"ACT", "ADVANTAGE"), freq = c(1L, 1L, 1L, 4L, 2L, 1L)), .Names = c("Name", 
"freq"), row.names = c(NA, 6L), class = "data.frame") 

我試圖找出如何從AppleBerry,並且Orange獲得output一個更data.frame。我正在尋找一個解決方案,可以用於多個數據幀,最好不必手動提供數據幀。

可以假設data.frame名稱爲獲取output處理可在列表df_names

df_names = c("Apple","Berry","Orange") 

或者,你也可以認爲在Global Environment需要每data.frame被處理創建output

+0

您可以創建數據框的列表並使用lapply嗎? –

回答

3

如果您的環境中包含所有數據幀,則可以將它們放入指定列表中,然後使用包reshape2重新整理列表。如果需要,您可以將第一列設置爲行名稱。

library(reshape2) 
dcast(melt(Filter(is.data.frame, mget(ls()))), L1 ~ Name) 
#  L1 ABIDING ABLE ABROAD ACHIEVE ACROSS ACT ACTION ACTIVISM ACTS ADDICTION ADVANCE ADVANCING ADVANTAGE 
# 1 Apple  1 1  1  NA  4 2  NA  NA NA  NA  NA  NA   1 
# 2 Berry  NA NA  NA  NA  NA 2  2  1 1   1  1  NA  NA 
# 3 Orange  NA NA  NA  1  3 1  1  NA NA  NA  1   1  NA 

注:這是假設所有的數據是在全球環境中並沒有其他的數據幀都存在,除了要在此處使用的人。

1

我們可以使用tidyverse

library(dplyr) 
library(tidyr) 
list(Apple = Apple, Orange = Orange, Berry = Berry) %>% 
      bind_rows(.id = "objName") %>% 
      spread(Name, freq, fill = 0) 
# objName ABIDING ABLE ABROAD ACHIEVE ACROSS ACT ACTION ACTIVISM ACTS ADDICTION ADVANCE ADVANCING ADVANTAGE 
#1 Apple  1 1  1  0  4 2  0  0 0   0  0   0   1 
#2 Berry  0 0  0  0  0 2  2  1 1   1  1   0   0 
#3 Orange  0 0  0  1  3 1  1  0 0   0  1   1   0 

當你有72個data.frames,最好不要建立在全球環境中的所有這些對象。而是讀取list中的數據集文件,然後執行處理。假設,如果這些文件都在工作目錄

files <- list.files(pattern = ".csv") 
lapply(files, read.csv, stringsAsFactors=FALSE) 

,然後做處理與上面bind_rows。由於不清楚文件名,我們無法評論如何創建'objName'

相關問題