[英]R - Grouping rows by matching value then adding rows to matching columns in another data frame
[英]Adding single rows of a data frame as columns to a large number of other datasets matching 1 by 1
我有23個數據框,每個數據框包含約200個變量的20個觀測值,另一個數據框包含13個變量和23個觀測值。 這13個變量保存有關23個數據幀的信息。
我想做的是找到一種方法,將信息從單獨的數據幀添加到23個列表中的每個對應數據幀中,以使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()查看特定列是我需要的結果。 例如,在幀末尾的新列包含“ time”之類的變量,對於“ 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個Observation,其中包含我想在原始幀末尾添加的13個變量。
在那之后,一切基本都變得穩定了。 我已經嘗試過Google幾個小時,但實際上什么都沒用。 通常,我一直嘗試將其作為列表,直到我意識到這是一個不好的主意,而沒有首先正確地處理訂單(我現在實際上知道如何解決該問題,但是現在我沒有精力去做)如果您有一個包含列表的解決方案,該列表包含列表中存儲的每個數據框的名稱,那么我敢肯定可以做到這一點。
編輯所以我試圖做一個例子,並說明我來自哪里。 我希望它更清楚。 我知道我很遺憾不能像這樣解決“ 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:我在這里的第一篇文章,希望它可讀。
如果有一堆data.frame的名稱中都帶有數字,則表明您沒有在以“ 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()
列表中的每個data.frame到的每一行lf
。 這將返回一個包含所有更新的data.frames的新列表。
Map(function(a,b) {row.names(b)<-NULL; cbind(a, b)} ,
mget(ls(pattern="^df\\d+")),
split(lf, 1:nrow(lf))
)
由於缺少可復制的示例,因此很難確切知道您想要什么。 您應該提供小的輸入數據集並顯示所需的輸出。 這將使測試解決方案更加容易。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.