簡體   English   中英

將數據框的單行作為列添加到大量其他匹配1比1的數據集中

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM