2015-08-16 116 views
1

有沒有辦法創建一個data.frame比我在下面做的更快或更聰明?快速創建data.frame

df <- data.frame(ID = rep(c("WT", "KO"), each = 4), 
       Time = rep(c("A", "B", "C", "D"), times = 2), 
       replicate(5,sample(0:100,8,rep=TRUE))) 

colnames(df)<-c("ID", "Time", c("a", "b", "c", "d", "e")) 

的data.frame應該還是這個樣子

df 
ID Time a b c d e 
WT A 28 56 50 60 15 
WT B 54 77 11 67 34 
WT C 53 8 87 62 55 
WT D 30 73 47 82 1 
KO A 24 83 14 17 36 
KO B 91 83 72 41 4 
KO C 79 17 76 21 54 
KO D 41 40 77 49 92 

感謝

+2

你可以像'data.frame財產以後(expand.grid(C( 「WT」, 「KO」),填寫[1 :4]),矩陣(樣本(40),ncol = 5))' –

+0

謝謝。如何將colname包含在一起? – Al14

+0

我可以使用名稱而不是setNames嗎?它對我不起作用 – Al14

回答

6

您可以只使用expand.grid對於非數值唯一組合(有時你甚至可以利用它內置的數據設置這樣的LETTERS)並且只運行sample而將其包裝成矩陣,類似於

set.seed(123) 
data.frame(expand.grid(c("WT", "KO"), LETTERS[1:4]), 
      matrix(sample(40), ncol = 5)) 
# Var1 Var2 X1 X2 X3 X4 X5 
# 1 WT A 12 36 6 11 24 
# 2 KO A 31 15 1 27 13 
# 3 WT B 16 29 8 22 25 
# 4 KO B 33 14 21 28 26 
# 5 WT C 34 19 32 4 20 
# 6 KO C 2 38 37 35 7 
# 7 WT D 18 3 40 10 5 
# 8 KO D 30 23 17 9 39 

對於不特定的情況下,我會建議尋找到@TylerRinkers wakefield包,它允許你生成隨機數據集輕鬆。


只是一般信息,使用data.table v 1.9.5+您可以參考使用setnames現在設置新的列名。因爲,例如,如果你的新的數據集稱爲res,人們可以簡單地做

library(data.table) # v1.9.5+ 
setnames(res, c("ID", "Time", letters[1:5])) 
+0

爲了放大要採樣的數字,我嘗試了樣本(0:100,8,rep = TRUE)而不是樣本(40),但它沒有奏效。 – Al14

+1

你的意思是像矩陣(樣本(100),ncol = 10)'? 100不等於8。 –

+0

我想從一個更大的羣組中隨機抽取我的40個數字矩陣(樣本(40)),1000個數字,或者甚至只是隨機的,例如正數和負數 – Al14