2013-06-20 67 views
2

我有這個數據幀第n列:填寫一個數據幀

df <- data.frame(A=c("a","b","c","d","e","f","g","h","i"), 
      B=c("1","1","1","2","2","2","3","3","3"), 
      C=c(0.1,0.2,0.4,0.1,0.5,0.7,0.1,0.2,0.5)) 

> df 
    A B C 
1 a 1 0.1 
2 b 1 0.2 
3 c 1 0.4 
4 d 2 0.1 
5 e 2 0.5 
6 f 2 0.7 
7 g 3 0.1 
8 h 3 0.2 
9 i 3 0.5 

我想補充1000還列,並填寫此欄與所產生的價值:

transform(df, D=ave(C, B, FUN=function(b) sample(b, replace=TRUE))) 

我已經試着用for循環,但它不工作:

for (i in 4:1000){ 
    df[, 4:1000] <- NA 
    df[,i] = transform(df, D=ave(C, B, FUN=function(b) sample(b, replace=TRUE))) 
    } 

回答

2

爲了提高效率,我建議每個運行sample只有一次組。這可以實現這一目標:

sample2 <- function(x, size) 
{ 
    if(length(x)==1) rep(x, size) else sample(x, size, replace=TRUE) 
} 


new_df <- do.call(rbind, by(df, df$B, 
      function(d) cbind(d, matrix(sample2(d$C, length(d$C)*1000), 
             ncol=1000)))) 

注:

  1. 我創建sample2萬一有隻有一個C值一組。檢查?sample看看我的意思。

  2. 列的名稱將是數字,從1到1000.這可以根據@agstudy的答案進行更改。

  3. 行名也被改變。 「修復」他們是相似的,只需使用row.names而不是col.names

+0

謝謝@ Ferdinand.kraft,我仍然不完全理解你的代碼,只是爲了確保sample2採用的'd $ C'值與那些具有相同'df $ B'值的值相對應? – user2380782

+0

非常感謝@ Ferdinand.kraft的解釋。事實上,有一些組只有一個值,所以你的sample2函數解決了這個問題。非常感謝!!!! – user2380782

2

使用replicate例如:

cbind(df,replicate(1000,ave(df$C, df$B, 
      FUN=function(b) sample(b, replace=TRUE)))) 

要增加4列,例如:

cbind(df,replicate(4,ave(df$C, df$B, 
    FUN=function(b) sample(b, replace=TRUE)))) 

    A B C 1 2 3 4 
1 a 1 0.1 0.2 0.2 0.1 0.2 
2 b 1 0.2 0.4 0.2 0.4 0.4 
3 c 1 0.4 0.1 0.1 0.1 0.1 
4 d 2 0.1 0.1 0.5 0.5 0.1 
5 e 2 0.5 0.7 0.1 0.5 0.1 
6 f 2 0.7 0.1 0.7 0.7 0.7 
7 g 3 0.1 0.2 0.5 0.2 0.2 
8 h 3 0.2 0.2 0.1 0.2 0.1 
9 i 3 0.5 0.5 0.5 0.1 0.5 

也許你需要像重命名列:

gsub('([0-9]+)','D\\1',colnames(res)) 
1] "A" "B" "C" "D1" "D2" "D3" "D4" 
+0

謝謝@agstudy,你的方法也可以完美工作。我已經標記了第二個答案,因爲當只有一個組只有一個值時,避免「樣本」的不良行爲。但是,非常感謝!!!!!!! – user2380782