2014-10-10 141 views
1

我有一個有四列的數據框,我們稱之爲V1-V4和十個觀察值。 V1-V4中的一個是每行1個,V1-V4中的其他一個是0.我想創建一個名爲NEWCOL的新列,如果V3是1,則取值3;如果V4是1,則取4;否則爲0。從4個模型創建一個因子/分類變量

我必須爲許多組變量V1-V4做到這一點,所以我希望解決方案儘可能短,以便它很容易複製。

+1

歡迎來到SO。你需要提供一個[可重現的例子](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)來獲得最佳答案。 – 2014-10-10 17:20:54

回答

1

這會爲4列,以添加的第五使用矩陣乘法:

> cbind(mydf, newcol=data.matrix(mydf) %*% c(0,0,3,4)) 
    V1 V2 V3 V4 newcol 
1 1 0 0 0  0 
2 1 0 0 0  0 
3 0 1 0 0  0 
4 0 1 0 0  0 
5 0 0 1 0  3 
6 0 0 1 0  3 
7 0 0 0 1  4 
8 0 0 0 1  4 
9 0 0 0 1  4 
10 0 0 0 1  4 

可以通用化獲得多列......我們只需要規則。您需要使用與原始數據中的列相同數量的行,併爲構建每個新變量所需的每個新因素設置一列。這顯示瞭如何從第三列的3倍加上第四的四倍,以及從第一次的兩倍和第二次的兩倍的另一新列中構建一個新列。

> cbind(mydf, newcol=data.matrix(mydf) %*% matrix(c(0,0,3,4, # first set of factors 
                1,2,0,0), # second set 
                ncol=2)) 
    V1 V2 V3 V4 newcol.1 newcol.2 
1 1 0 0 0  0  1 
2 1 0 0 0  0  1 
3 0 1 0 0  0  2 
4 0 1 0 0  0  2 
5 0 0 1 0  3  0 
6 0 0 1 0  3  0 
7 0 0 0 1  4  0 
8 0 0 0 1  4  0 
9 0 0 0 1  4  0 
10 0 0 0 1  4  0 
+0

非常感謝! – garson 2014-10-19 15:52:15

0

的示例數據集:

mydf <- data.frame(V1 = c(1, 1, rep(0, 8)), 
        V2 = c(0, 0, 1, 1, rep(0, 6)), 
        V3 = c(rep(0, 4), 1, 1, rep(0, 4)), 
        V4 = c(rep(0, 6), rep(1, 4))) 
# V1 V2 V3 V4 
# 1 1 0 0 0 
# 2 1 0 0 0 
# 3 0 1 0 0 
# 4 0 1 0 0 
# 5 0 0 1 0 
# 6 0 0 1 0 
# 7 0 0 0 1 
# 8 0 0 0 1 
# 9 0 0 0 1 
# 10 0 0 0 1 

下面是一個簡單的方法,以產生新的列:

mydf <- transform(mydf, NEWCOL = V3 * 3 + V4 * 4) 
# V1 V2 V3 V4 NEWCOL 
# 1 1 0 0 0  0 
# 2 1 0 0 0  0 
# 3 0 1 0 0  0 
# 4 0 1 0 0  0 
# 5 0 0 1 0  3 
# 6 0 0 1 0  3 
# 7 0 0 0 1  4 
# 8 0 0 0 1  4 
# 9 0 0 0 1  4 
# 10 0 0 0 1  4 
+0

是的,謝謝!我已經想到了那個,但我必須爲很多組列(例如1-4,5-8,9-12,13-16,一直到97-100)做這個工作。有沒有更多的自動化的做法,所以我不必每次都重新輸入? – garson 2014-10-10 17:34:26

+2

@garson定義規則,我們將看到我們可以做什麼。 – 2014-10-10 18:01:49