2015-07-28 76 views
0

我想构建一个数据框,其中有一系列包含另一列的随机分配的列。数据有一些需要维护的结构。即我想随机分配L许多时间,同时保持V的结构。我想要一个看起来像这样的数据框;R中的随机列循环

L B V A 
1 1 1 2 10.9 
2 1 1 2 6.5 
3 1 1 2 8.6 
4 1 1 3 11.1 
5 1 1 4 13.1 
6 1 1 6 11.5 

并创建此;

 ID L B V A R1 R2 R3 R4 R5 
1 1_1_2 1 1 2 10.9 27 20 19 6 26 
2 1_1_2 1 1 2 6.5 27 20 19 6 26 
3 1_1_2 1 1 2 8.6 27 20 19 6 26 
4 1_1_3 1 1 3 11.1 6 28 4 26 26 
5 1_1_4 1 1 4 13.1 16 2 6 14 32 
6 1_1_6 1 1 6 11.5 17 21 3 11 25 

我可以做到这一点使用下面的脚本中手动,但我不知道是否有一个平稳的方式,使这个自动化的,因为我想这样做数百randomisations,使列R1,R2,R3。 。R n(所以这样做的循环比手动重复代码更可取)。

# Example Data Frame # 
df = data.frame(sample(1:33, 1000, replace = T), sample(1:3, 1000, replace = T), sample(1:9, 1000, replace = T), round(rnorm(1000, 10, 2),1)) 
colnames(df) = c("L", "B", "V", "A") 
df = transform(df,id=as.numeric(factor(df$V))) 
df = data.frame(as.factor(df[,1]),as.factor(as.numeric(df[,2])),as.factor(df[,5]),as.numeric(df[,4])) 
colnames(df) = c("L","B","V","A") 
df = df[order(df$L, df$B, df$V),] 
rownames(df) = NULL 
head(df) 

# ID # 
df$ID = paste(df[,1], df[,2], df[,3], sep = "_") 
ID = unique(as.vector(df$ID)) 

# R1 # 
ID2 = data.frame(ID, sample(ID)); colnames(ID2) = c("ID","R1") 
df = merge(df, ID2) 
df$R1 = as.factor(do.call(rbind, strsplit(as.vector(df$R1), split="_"))[,1]) 

# R2 # 
ID2 = data.frame(ID, sample(ID)); colnames(ID2) = c("ID","R2") 
df = merge(df, ID2) 
df$R2 = as.factor(do.call(rbind, strsplit(as.vector(df$R2), split="_"))[,1]) 

# R3 # 
ID2 = data.frame(ID, sample(ID)); colnames(ID2) = c("ID","R3") 
df = merge(df, ID2) 
df$R3 = as.factor(do.call(rbind, strsplit(as.vector(df$R3), split="_"))[,1]) 

# R4 # 
ID2 = data.frame(ID, sample(ID)); colnames(ID2) = c("ID","R4") 
df = merge(df, ID2) 
df$R4 = as.factor(do.call(rbind, strsplit(as.vector(df$R4), split="_"))[,1]) 

# R5 # 
ID2 = data.frame(ID, sample(ID)); colnames(ID2) = c("ID","R5") 
df = merge(df, ID2) 
df$R5 = as.factor(do.call(rbind, strsplit(as.vector(df$R5), split="_"))[,1]) 

我怎样才能创建一个循环,这将做到这一点在ň列数?

+2

我不明白这个随机背后的逻辑,你不能只是做例如'df [paste0(“R”,1:5)] < - sample(33,5)[rep(1:5,each = nrow(df))]'? –

+0

不,维持** L **结构,而不** ** V **。我的意思是我想让所有具有相同** V **值的行被赋予相同的随机选择值** L **。 – Ell

+0

在你的例子*所有*的值都是相同的'V'和'L'。所以也许让你的例子更合理? –

回答

0

从上面的代码中,我终于得到了一个答案继:

# ID # 
df$ID = paste(df[,1], df[,2], df[,3], sep = "_") 
ID = unique(as.vector(df$ID)) 

n = 5 
Rs  = as.vector(rep(NA,n)) 

for(i in 1:n){ 
Rs[i] =  paste("R",i, sep = "") 
} 
Rs 

for(i in 1:n){ 
df[,5+i] = NA 
colnames(df)[5+i] = paste(Rs[i]) 
ID = unique(as.vector(df$ID)) 
ID2 = data.frame(ID, sample(ID)) 
ID2 = merge(df, ID2) 
df[5+i] = as.factor(do.call(rbind, strsplit(as.vector(ID2[,6+i]), split="_"))[,1]) 
} 
head(df) 

给出结果:

L B V A ID R1 R2 R3 R4 R5 
1 1 1 2 10.1 1_1_2 21 12 27 4 26 
2 1 1 4 7.7 1_1_4 7 29 2 9 10 
3 1 1 5 9.7 1_1_5 27 27 3 1 22 
4 1 1 5 8.3 1_1_5 27 27 3 1 22 
5 1 1 7 9.5 1_1_7 13 15 32 19 11 
6 1 1 7 12.4 1_1_7 13 15 32 19 11