快速创建data.frame

Al1*_*l14 1 r dataframe

有没有办法比我下面制作的更快或更智能地创建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"))
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

谢谢

Dav*_*urg 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
Run Code Online (Sandbox Code Playgroud)

对于不太具体的情况,我建议查看@TylerRinkers wakefield包,它允许您轻松生成随机数据集.


只是作为一般信息,使用data.tablev 1.9.5+现在你可以设置新的列名通过参考使用setnames.例如,如果您的新数据集被调用res,可以简单地做

library(data.table) # v1.9.5+
setnames(res, c("ID", "Time", letters[1:5]))
Run Code Online (Sandbox Code Playgroud)