我有一個有四列的數據框,我們稱之爲V1-V4和十個觀察值。 V1-V4中的一個是每行1個,V1-V4中的其他一個是0.我想創建一個名爲NEWCOL的新列,如果V3是1,則取值3;如果V4是1,則取4;否則爲0。從4個模型創建一個因子/分類變量
我必須爲許多組變量V1-V4做到這一點,所以我希望解決方案儘可能短,以便它很容易複製。
我有一個有四列的數據框,我們稱之爲V1-V4和十個觀察值。 V1-V4中的一個是每行1個,V1-V4中的其他一個是0.我想創建一個名爲NEWCOL的新列,如果V3是1,則取值3;如果V4是1,則取4;否則爲0。從4個模型創建一個因子/分類變量
我必須爲許多組變量V1-V4做到這一點,所以我希望解決方案儘可能短,以便它很容易複製。
這會爲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
非常感謝! – garson 2014-10-19 15:52:15
的示例數據集:
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
是的,謝謝!我已經想到了那個,但我必須爲很多組列(例如1-4,5-8,9-12,13-16,一直到97-100)做這個工作。有沒有更多的自動化的做法,所以我不必每次都重新輸入? – garson 2014-10-10 17:34:26
@garson定義規則,我們將看到我們可以做什麼。 – 2014-10-10 18:01:49
歡迎來到SO。你需要提供一個[可重現的例子](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)來獲得最佳答案。 – 2014-10-10 17:20:54