2012-10-28 37 views
1

所以,我知道我可以用data.frame命令多個向量合併成一個數據幀,像這樣:在R中,如何輕鬆將多個向量組合成一個數據幀?

my.data <- data.frame(name1, age1, name20, age20, name38, age38) 

(我知道,變量名沒有多大意義,爲什麼我會在三個不同的列中需要name1,name20和name38?請忽略:我的實際變量名稱不同 - 這僅用於說明目的)。

問題是,我有大約40個這樣的向量,並且我還需要在我的代碼的其他部分中組合許多向量。因此,我不會每次都複製粘貼大量的代碼。所以我想寫一個圍繞此循環:

for (i in c("name", "age", "hgt")) 
{ 
    for (k in c(1,20,38)) 
    { 
    my.data$i,as.character(k) <- data.frame(get(paste(i,as.character(k),sep=""))) 
    } 
} 

但這是行不通的。這是因爲我應該在這些代碼中寫入「paste()」,或者這是解決這個問題的不好方法嗎?什麼是正確的方式來循環通過我和K並得到一個「新數據」數據框作爲最終結果與所有載體作爲列連接?

+1

爲什麼不更改創建所有這些向量的代碼,而是將它們創建爲data.frame以開始? – mdsumner

回答

2

您是否試圖實現類似以下的事情,也許?

name1 <- letters[1:10] 
age1 <- 1:10 
name20 <- letters[11:20] 
age20 <- 11:20 
name38 <- LETTERS[1:10] 
age38 <- 21:30 

paste.pattern <- paste(rep(c("name", "age"), times = 3), 
         rep(c(1, 20, 38), each = 2), sep = "") 

newdata <- data.frame(sapply(paste.pattern, get)) 
+0

是的,這個效果很好,雖然其他答案似乎更靈活,因爲我不需要指定代理 – user1780218

+1

只需要執行'paste.pattern < - outer(c(「name」,「age」),c (1,20,38),paste0)'第一部分。或者,'paste.pattern < - do.call(paste0,expand.grid(c(「name」,「age」),c(1,20,38)))''。 –

1

如果您所有的個人載體具有類似幹(如:hgt)和數量(例如1)的安排,那麼你可以做這樣的事情:

# test data 
name1 <- letters[1:10] 
age1 <- 1:10 
name20 <- letters[11:20] 
age20 <- 11:20 
name38 <- LETTERS[1:10] 
age38 <- 21:30 

# group them up in a dataframe looking for "age" OR (|) "name" as the stem 
data.frame(sapply(ls(pattern="^age[0-9]+$|^name[0-9]+$"),get)) 

# result: 
    age1 age20 age38 name1 name20 name38 
1  1 11 21  a  k  A 
2  2 12 22  b  l  B 
3  3 13 23  c  m  C 
4  4 14 24  d  n  D 
5  5 15 25  e  o  E 
6  6 16 26  f  p  F 
7  7 17 27  g  q  G 
8  8 18 28  h  r  H 
9  9 19 29  i  s  I 
10 10 20 30  j  t  J 

這將限制包括矢量到幹/數字命名模式,以確保您不會在數據框中獲得任何驚喜增加。

+0

這很好用!但是,當我使用自己的數據運行它時,新數據框的第一列被稱爲「get.paste.i ..._ in ... as.character.k .... m ... sep ... ...「。你知道這裏發生了什麼嗎?各個向量在任何地方都沒有這個變量名。 PS。內容只是一個計數器(行)。因此,現在我再次刪除該列,使用newdata [,c(1)] < - NULL – user1780218

+0

@ user1780218 - 我已經對代碼行進行了一些編輯,以便它在選擇時更加嚴格。矢量名稱必須以詞幹開頭,並在數字之後直接結束。這應該解決任何意想不到的匹配。 – thelatemail

相關問題