2011-06-02 120 views
2

我有兩個數據幀,我希望將一個數據幀的值插入另一個(我們稱之爲DF1DF2)。R使用for()循環來填充另一個數據幀

DF1由2列1和2列1(col1)所包含的字符a到z以及col2具有與每個字符(從a到z)相關聯的值

DF2是與3列的數據幀。前兩種包括DF1$col1的所有組合:aa ab ac ad等;其中,第一個字母是col1,第二個字母是col2

我想創建利用DF1$col2值的簡單的數學模型,看物體的各種可能組合的結果在DF1$col1 的第一步,我想do的做法是將DF1$col2的值轉換爲DF2$col3DF2$col3的值應該與DF2col1中的值相關聯),但這是我卡住的地方。我現在有

for(j in 1:length(DF2$col1)) 
{ 
    ## this part is to use the characters in DF2$col1 as an input 
    ## to yield the output for DF2$col3-- 
    input=c(DF2$col1)[j] 

    ## This is supposed to use the values found in DF1$col2 to fill in DF2$col3 

    g=DF1[(DF1$col2==input),"pred"] 

    ## This is so that the values will fill in DF2$col3-- 
    DF2$col3=g 
} 

當我運行此,DF2$col3將具有相同值從DF1填補了一個特定的字符(如DF2$col3將有無不洋溢着用字符「a」從DF1關聯的值的行) 我究竟做錯了什麼?

多謝您的時間

+1

你試過'merge'嗎?請參閱http://stackoverflow.com/q/4878773/210673 – Aaron 2011-06-02 20:36:51

+0

爲什麼自從您提到'col1'和'col2'代表'df1'時,您將'pred'視爲colname? – chl 2011-06-02 21:00:09

+0

這是一個錯誤;我忘了用df1替換pred $ col2〜_〜 – Anon 2011-06-02 21:35:06

回答

4

你真的應該使用merge此爲@Aaron建議在他的上述評論,但如果你堅持自己寫循環,比你在你的最後一行的問題,因爲您將g值分配給整個col3列。你應該有使用j指數也一樣:

for(j in 1:length(DF2$col1)) 
{ 
    DF2$col3[j] = DF1[(which(DF1$col2 == DF2$col1[j]), "pred"] 
} 

如果這是行不通的,不是取悅也發佈一些示例數據庫能在更多的細節來幫助(我不知道,但有gues什麼可能是"pred")。

+0

哦,geez - 我沒有意識到合併可以像這樣使用(新手在這裏)。感謝你和@Aaron。我忘了將「pred」更改爲「DF1 $ col2」,但我想讓您知道替代代碼也適用。 – Anon 2011-06-02 21:14:12

0

不知道我完全理解你的問題,但你可以試試這個:

df1 <- data.frame(col1=letters[1:26], col2=sample(1:100, 26)) 
df2 <- with(df1, expand.grid(col1=col1, col2=col1)) 
df2$col3 <- df1$col2 

的最後一個命令使用回收(它可以作爲writtent rep(df1$col2, 26)爲好)。

結果如下圖所示:

> head(df1, n=3) 
    col1 col2 
1 a 68 
2 b 73 
3 c 45 
> tail(df1, n=3) 
    col1 col2 
24 x 22 
25 y 4 
26 z 17 
> head(df2, n=3) 
    col1 col2 col3 
1 a a 68 
2 b a 73 
3 c a 45 
> tail(df2, n=3) 
    col1 col2 col3 
674 x z 22 
675 y z 4 
676 z z 17 
1

這聽起來像你正在嘗試做的是一個簡單的連接,也就是比賽DF1$col1DF2$col1和複製從DF1$col2相應的值到DF2$col3。嘗試:

DF1 <- data.frame(col1=letters, col2=1:26, stringsAsFactors=FALSE) 
DF2 <- expand.grid(col1=letters, col2=letters, stringsAsFactors=FALSE) 
DF2$col3 <- DF1$col2[match(DF2$col1, DF1$col1)] 

此使用函數match(),其中,作爲文檔狀態,「返回在其第二的第一個參數的(第一)匹配的位置的向量。」您在DF1$col1中的值是唯一的,所以這種方法不會有任何問題。

作爲一個方面說明,在R中通常最好是向量化你的工作而不是使用顯式循環。