2015-08-16 113 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