2017-10-12 24 views
1

由行的名稱結合不同長度的數據幀的名單上有不同長度的數據幀,通過年索引的列表(DF),使得數據的代理看起來像:中的R

df 

    $df1   
     X..i.. 
    1999  10 
    1998  13 
    1997  14 

$df2 
     X..i.. 
1999  20 
1998  11 

$df3 
     X..i.. 
1999  17 
1998  8 
1997  9 
1996  19 

我想使用和維護索引/ rownames這些數據幀到一個單一的數據幀合併

這樣:

df_all 
Index  df1 df2 df3 
    1999  10 20 17 
    1998  13 11  8 
    1997  14 n/a 9 
    1996  n/a n/a 19 

編輯:

smalldflist <- lapply(bai_df, function(i) head(i, 10)) 
dput(smalldflist) 

產生以下輸出:

結構(列表(IN_DonaldsonWoods_QUAL.txt =結構(列表(X..i .. = C(4.5528243479162, 32.6474339976978,52.7116018957456,170.932582874866,227.0430440174, 191.462399206825, ),.name = c(「1725」, 「1726」,「1727」,「1728」,「1729」,226.94053541991,274.854835798233,336.457600434571, 409.132933511232)),.Names =「X..i ..」 「... 1730」,「1731」,「1732」,「1733」, 「1734」),class =「data.frame」),IN_DonaldsonWoods_QURU.txt = structure(list( X..i .. = c(4.33729067152776) ,5.72878688080428,13.0247658962315, 22.0205798005054,25.9885943197615,18.9273551074104,43.5197887382031, 58.2775710248884,72.9225976242458,73.0466756114972)),.Names = 「X..i ..」,row.names = C( 「1827」, 「1828」, 「1829」,「 1830「,」1831「,」1832「,」1833「,」1834「,」1835「, 」1836「),class =」data.frame「),IN_DonaldsonWoods_QUVE.txt = structure(list( )我.. = C(7.87253273859391,18.9481296742303,42.5055176960097, 62.9980951594496,88.906442207264,74.2523230533691,106.911242713809, 152.445167763284,192.399603839633,221.263660216113)),.Names = 「X..i ..」,row.names = C(「1731 「, 」1732「,」1733「,」1734「,」1735「,」1736「,」1737「,」1738「,」1739「, 」1740「),class =」data.frame「 IN_LillyDickey_QUAL.txt =結構(列表( X..i .. = C(8.29576810088555,17.2934968058816,31.2091720401804, 33.8966066349882,47.6496887415004,32.9921546763907,82.2281435044324, 108.068226885475,103.894002151431,110.255812097949)),.Names = 「X..i ..」,row.names = c(「1863」, 「1864」,「1865」,「1866」,「1867」,「1868」,「1869」,「1870」,「1871」, 「1872」),class =「data。幀 「),IN_LillyDickey_QUMO.txt =結構(列表( X..i .. = C(3.42413493048312,8.0847630303073,19.6833503197648, 13.791136218324,21.4638165402601,30.6707376168741,30.8789937938806, 26.8661212585221,24.0732956549621,29.7872997715364)),.Names =」 X..i ..「,row.names = c(」1867「, 」1868「,」1869「,」1870「,」1871「,」1872「,」1873「,」1874「,」1875「 , 「1876」),class =「data.frame」),IN_P ioneers_QUAL.txt =結構(列表( X..i .. = C(9.14340435634345,23.5108626053757,33.8507393822465, 46.1027716604662,57.5247983011993,50.5892015892391,92.2448163706925, 225.832932372368,278.367628044195,193.931508820174)),.Names =「X..i ...「,row.names = c(」1817「, 」1818「,」1819「,」1820「,」1821「,」1822「,」1823「,」1824「,」1825「, 」1826 「),類= 「data.frame」),IN_Pioneers_QURU.txt =結構(列表( X..i .. = C(122.443727611702,658.649900930018,830.471777578934, 843.357139228152,1725.6495913006,1244.38668477703,973.00892131628, 1294.7441782001,1717.18570086886, 1676.63841798444)),.Names =「X..i ..」,行。名稱= c(「1861」, 「1862」,「1863」,「1864」,「1865」,「1866」,「1867」,「1868」,「1869」, 「1870」 data.frame「),OH_JohnsonWoods_QUAL.txt =結構(列表( X..i .. = C(1.9113449704439,3.39794661412248,5.32688450342693,6.41921626908008 ,11.0307601252838,13.0825342873437,15.843680070585, 16.885746353779,20.1011664347289,19.853294774361)),.Names =「X..i ..」,row.names = c(「1626」, 「1627」,「1628」,「1629」,「1630」,「1631」,「1632」,「1633」,「 1634" , 「1635」),類= 「data.frame」)),.Names = C( 「IN_DonaldsonWoods_QUAL.txt」, 「IN_DonaldsonWoods_QURU.txt」, 「IN_DonaldsonWoods_QUVE.txt」, 「IN_LillyDickey_QUAL.txt」, 「IN_LillyDickey_QUMO.txt」,「IN_Pioneers_QUAL.txt」,「IN_Pioneers_QURU.txt」, 「OH_JohnsonWoods_QUAL.txt」))

+1

你能粘貼'dput(DF)'的結果呢?這將使您更輕鬆地處理數據並處理解決方案。 – beigel

+0

@beigel我提供的數據只是一個代理。我正在處理大數據集 –

+1

創建一個更小的df列表,如10行X 3列:'smalldfList < - lapply(dfList,function(i)head(i,10)[c(「col1」,「col2」 COL3" )])'。然後'dput(smalldfList)',然後在這裏發佈gobblyegook(相信我們,我們知道如何使用它)。 – Parfait

回答

1

您可以使用Reducemerge多個數據幀。設置爲all = TRUE,當不匹配時添加NAs。注意df是您設置的數據框列表,by指示用於合併的列。因此,在您的數據框列表中,「索引」應該是每個數據框中年份列的名稱。

Reduce(function(...) merge(..., by="Index", all=TRUE), df) 

並感謝@jazzuro提供的樣本數據,這裏是基地R.在此示例中使用Reduce設置用於合併by="year"列等價的解決方案:

df1 <- data.frame(year = c(1999, 1998, 1997), 
       value = c(10, 13, 14)) 

df2 <- data.frame(year = c(1999, 1998), 
       value = c(20, 11)) 

df3 <- data.frame(year = c(1999, 1998, 1997, 1996), 
       value = c(17, 8, 9, 19)) 
df <- list(df1=df1, df2=df2, df3=df3) 
df_merge <- Reduce(function(...) merge(..., by="year", all=TRUE), df) 
colnames(df_merge) <- c("Index", names(df)) 

# Index df1 df2 df3 
# 1 1996 NA NA 19 
# 2 1997 14 NA 9 
# 3 1998 13 11 8 
# 4 1999 10 20 17 
+0

這是產生以下錯誤:f(init,x [[i]])中的錯誤:未使用的參數(x [[i]]) –

+0

當我沒有數據時,我很難排除錯誤是一種可用的格式。正如@beigel所建議的那樣,您需要將'dput(df)'的輸出粘貼到您的問題中,其中df是代理數據,其結構應與您的實際數據相同 – Djork

+0

dput(df)的輸出超過問題 –

1

如果你有數據你只需要在全球環境中,你可以嘗試以下。首先,您收集所有數據框架中的獨特年份並創建一個主數據框架,其中僅包含獨特的年份。然後,將所有數據幀放入列表中,並將其與master合併。由於您擁有temp中的主數據框,因此將其刪除。最後,你綁定所有數據幀並將長格式改爲寬格式。

library(tidyverse) 

# Create a data frame with all unique years 

master <- data.frame(year = mget(ls()) %>% 
          sapply(`[`, 1) %>% 
          as_vector %>% 
          unique) 

# Merge each data frame with the master df 
temp <- mget(ls()) %>% 
     lapply(function(x){full_join(x, master, by = "year")}) 

# Remove the master df in the list 
temp[["master"]] <- NULL 

# Bind all dfs and make it wide. 
bind_rows(temp, .id = "data") %>% 
spread(key = data, value = value) 

# year df1 df2 df3 
#1 1996 NA NA 19 
#2 1997 14 NA 9 
#3 1998 13 11 8 
#4 1999 10 20 17 

DATA

df1 <- data.frame(year = c(1999, 1998, 1997), 
        value = c(10, 13, 14)) 

df2 <- data.frame(year = c(1999, 1998), 
        value = c(20, 11)) 

df3 <- data.frame(year = c(1999, 1998, 1997, 1996), 
        value = c(17, 8, 9, 19)) 
+0

Ben,請看看@jazzurro爲你提供的樣品數據是否爲你打了個好頭,這被認爲是一個可重複的例子,它是一種形式,用戶可以簡單地粘貼和使用來回答你的問題並排除錯誤:) – Djork

1

重新考慮合併鏈作爲@Djork表演,但要確保你創建一個名爲實際列,指數等於rownames()。此外,根據df#重命名X..1列,這也避免了合併期間出現重複列警告。下面DFS相當於發佈smalldflist

dfs <- lapply(seq_along(dfs), function(i){ 
     dfs[[i]]$Index = rownames(dfs[[i]])  # CREATE INDEX 
     colnames(dfs[[i]])[1] <- paste0("df", i) # RENAME X..1 COLUMN 

     return(dfs[[i]]) 
}) 

dfs[[1]] 
#    df1 Index 
# 1725 4.552824 1725 
# 1726 32.647434 1726 
# 1727 52.711602 1727 
# 1728 170.932583 1728 
# 1729 227.043044 1729 
# 1730 191.462399 1730 
# 1731 226.940535 1731 
# 1732 274.854836 1732 
# 1733 336.457600 1733 
# 1734 409.132934 1734 

finaldf <- Reduce(function(...) merge(..., by="Index", all=TRUE), dfs) 

finaldf 
# Index df1  df2  df3  df4 df5 df6 df7  df8 
# 1 1626  NA  NA  NA  NA  NA  NA NA 1.911345 
# 2 1627  NA  NA  NA  NA  NA  NA NA 3.397947 
# 3 1628  NA  NA  NA  NA  NA  NA NA 5.326885 
# 4 1629  NA  NA  NA  NA  NA  NA NA 6.419216 
# 5 1630  NA  NA  NA  NA  NA  NA NA 11.030760 
# ...