2016-08-18 42 views
0

我有23個數據幀,每個數據幀包含200個變量的〜20個觀察值,另一個數據幀包含13個變量和23個觀察值。這13個變量保存有關23個數據幀的信息。將數據框的單行作爲列添加到大量其他數據集,匹配1乘1

我想要做的是找到一種方法,將信息從單獨的數據框添加到23列表中的每個相應的數據框,以便在23個數據框中的每一箇中的每個觀察值將保存相同的值(例如整個數據幀已被記錄的時間點)。 單個數據幀中的第一行對應於列表中第一個數據幀的信息,等等。

ls() 
[1] "df1" "df10" "df11" "df12" "df13" "df14" "df15" "df16" "df17" "df18" "df19" "df2" 
[13] "df20" "df21" "df22" "df23" "df3" "df4" "df5" "df6" "df7" "df8" "df9" "i" 
[25] "lf" 

經過一番研究,我試圖把它放到列表,但意識到,我反倒不知道以何種順序列表存儲我的數據。我知道df1與單獨的框架「lf」中的第一行匹配(並且如果列表只是翻轉事情,我會以錯誤的方式匹配它)。

於是就只舉一個例子我想結合這在一定程度的工作(但不是太清楚):

> testdf <- c(df1,lf[1,]) 
> is.data.frame(testdf) 
[1] FALSE 
> testdf <- as.data.frame(testdf) 
> is.data.frame(testdf) 
[1] TRUE 

起初它是一個列表,但使用as.data.frame並具有看看使用View()的特定列是我需要的結果。例如包含像「時間」這樣的變量的幀末尾的新列,對於「df1」中的所有觀察值,其值爲13:37。

接下來,我嘗試了環......

for (i in 1:23){ 
+ assign(paste0("df",i), cbind(paste0("df",i),lf[i,], row.names = NULL)) 
+ } 

...基本上只是做我所做的第一多次(as.data.frame()是缺少在這裏,但它不改變一件事)。會發生什麼情況是,每個數據幀現在只有1個觀察值,其中包含13個我想在原始幀結尾處添加的變量。

之後,一切都基本上去了***。我試圖谷歌幾個小時,但沒有得到任何真正的工作。大多數情況下我都試着把它當成一個列表來玩,直到我意識到這並不是一個好主意,但卻沒有首先得到訂單(我現在真的知道我該如何解決這個問題,但現在我沒有精力去做如果你有一個列表包含列表中存儲的每個數據框的名稱的解決方案,我相信我可以達到這一點)。

編輯所以我試着做一個例子,並顯示我來自哪裏。我希望它更清楚。我知道,我很遺憾沒有像這樣解決它的「R-way」問題,這就是爲什麼我試圖查看列表並應用很多,但仍然無法提出解決方案的原因。

> #create 3 data frames, 5 observations and 10 variables each 
> df1 <- as.data.frame(matrix(rnorm(50, mean = 50, sd = 10), ncol = 10, nrow = 5)) 
> df2 <- as.data.frame(matrix(rnorm(50, mean = 50, sd = 10), ncol = 10, nrow = 5)) 
> df3 <- as.data.frame(matrix(rnorm(50, mean = 50, sd = 10), ncol = 10, nrow = 5)) 
> 
> #create lone data frame with 3 observerations (1 per data frame) and 2 variables 
> df4 <- as.data.frame(matrix(rnorm(6, mean = 5, sd = 1), ncol = 2, nrow = 3)) 
> 
> #create colnames for better explanation 
> cn <- c() 
> for (i in 1:12){ 
+  cn[i] <- paste0("Var",i) 
+ } 
> colnames(df1) <- cn[1:10] 
> colnames(df2) <- cn[1:10] 
> colnames(df3) <- cn[1:10] 
> colnames(df4) <- cn[11:12] 
> 
> #working example for 1 out of 3 matches 
> #adding the first row of the lone data frame "df4" containing 
> #Var11 and Var12 to df1. Result is as desired 
> newdf1 <- c(df1,df4[1,]) 
> as.data.frame(newdf1) 
     Var1  Var2  Var3  Var4  Var5  Var6  Var7  Var8  Var9 Var10 Var11 Var12 
1 52.37538 48.47529 41.93258 45.93547 41.71611 58.86811 40.70888 41.87981 56.80464 49.73488 5.233276 4.417211 
2 51.90261 61.72404 44.96621 48.59473 51.61673 51.07525 55.02000 43.48264 34.03446 48.93913 5.233276 4.417211 
3 39.85056 48.72688 49.93816 60.41899 54.90524 56.84387 53.92486 55.92178 50.81779 66.03640 5.233276 4.417211 
4 41.61915 53.22312 47.96660 50.79573 34.98073 41.81004 46.43976 45.49678 32.48257 58.65475 5.233276 4.417211 
5 58.52455 39.70007 51.26386 39.92583 47.08723 31.41743 45.34423 63.06964 61.07181 55.44908 5.233276 4.417211 
> df4 
    Var11 Var12 
1 5.233276 4.417211 
2 5.309388 5.375850 
3 6.342876 5.318077 

對所提供的任何幫助:)

PS真的很感激:我在這裏的第一篇文章,我希望它的可讀性。

回答

1

擁有一堆數據框架,名稱中包含數字的數字表明您沒有按照「R方式」執行操作。另一個跡象表明,事情看起來並不好,使用assign()。您通常應該將這些對象保存在R中的列表中。這使得一切都更容易處理。

但是,假設你有這樣的數據幀

df1<-data.frame(id=1:10, a=1:10) 
df2<-data.frame(id=1:10, b=1:10) 
df3<-data.frame(id=1:10, c=1:10) 

lf<-data.frame(x=1:3, y=1:3) 

我們可以使用ls()得到他們的名字和mget()在列表中返回它們。然後我們可以使用Map()cbind()列表中的每個數據幀到lf的每一行。這將返回所有更新的data.frames

Map(function(a,b) {row.names(b)<-NULL; cbind(a, b)} , 
    mget(ls(pattern="^df\\d+")), 
    split(lf, 1:nrow(lf)) 
) 

由於缺乏reproducible example很難知道你想要什麼新的列表。您應該提供小型輸入數據集並顯示所需的輸出。這將使測試解決方案變得更加容易。

+0

我加了一個例子,希望能讓我的問題更好一點。 – Susu

+0

@Susu我很確定我的解決方案正在按照您在示例中所展示的內容進行。只需保存結果'newdf <-Map(...)',你就可以用'newdf [[1]]'來得到它們,等等。 – MrFlick

相關問題