2016-05-12 9 views
1

this questiondata.tableで、私はちょうどdplyrと同等ですが、失敗には至りませんでした。R dplyrの名前を取得する行の数は

数値の列を持つ単純なデータフレームがあります。 dplyrを使用して最小値がの列の名前を取得したいとします。

私はこの問題を解決するための他の方法を知ってることに注意してください:

DF %>% select(2:4) %>% rowwise() %>% mutate(y = function(x) names(x)[which.min(x)]) 

DF %>% select(2:4) %>% rowwise() %>% mutate(y = apply(x1:x3, 1, which.min(x1:x3)) 
:現時点では私の唯一の関心は、私はいくつかのバリエーションを試してみました

id <- c(1,2,3,4,5,6,7,8,9,10) 
x1 <- c(2,4,5,3,6,4,3,6,7,7) 
x2 <- c(0,1,2,6,7,6,0,8,2,2) 
x3 <- c(5,3,4,5,8,3,4,2,5,6) 

DF <- data.frame(id, x1,x2,x3) 

dplyrアプローチであります

しかし、これを行う方法が見つかりませんでしたdplyr - 道。私は何かヒントに感謝します!

予想される出力:

DF 
##  id x1 x2 x3 y 
## 1: 1 2 0 5 x2 
## 2: 2 4 1 3 x2 
## 3: 3 5 2 4 x2 
## 4: 4 3 6 5 x1 
## 5: 5 6 7 8 x1 
## 6: 6 4 6 3 x3 
## 7: 7 3 0 4 x2 
## 8: 8 6 8 2 x3 
## 9: 9 7 2 5 x2 
## 10: 10 7 2 6 x2 
+0

'dplyr 'のようなものかどうかはわかりませんが、' DF%>%rowwise%>%mutate(y = names(。)[2:4] [which.min(c(x1 、x2、x3)))) 'が働いているようです。 – aosmith

答えて

2

これは(まあ、実際には非常に)不格好けど...

DF %>% 
    mutate(y = apply(.[,2:4], 1, function(x) names(x)[which.min(x)])) 
id x1 x2 x3 y 
1 1 2 0 5 x2 
2 2 4 1 3 x2 
3 3 5 2 4 x2 
4 4 3 6 5 x1 
5 5 6 7 8 x1 
6 6 4 6 3 x3 
7 7 3 0 4 x2 
8 8 6 8 2 x3 
9 9 7 2 5 x2 
10 10 7 2 6 x2 
+0

@eipi10の回答に対する 'system.time'は、1e6行のデータフレームでは約17.5秒でしたが、@aosmithがコメントで提供した答えは約94.1秒でした。両方のおかげで! – PavoDive

+0

一般的に非常に遅いと思われるので、私は 'rowwise'から離れようとします。 – eipi10

3

ここでは別のアプローチだ一種のようだ..私はdidnのベンチマークは実行していませんが、私の推測では、applyまたはrowwise

DF %>% 
    mutate(y = names(.)[max.col(.[2:4]*-1)+1L]) 
# id x1 x2 x3 y 
# 1 1 2 0 5 x2 
# 2 2 4 1 3 x2 
# 3 3 5 2 4 x2 
# 4 4 3 6 5 x1 
# 5 5 6 7 8 x1 
# 6 6 4 6 3 x3 
# 7 7 3 0 4 x2 
# 8 8 6 8 2 x3 
# 9 9 7 2 5 x2 
# 10 10 7 2 6 x2 

*-1私たちが代わりに最大の列と+1の分をしたいので、我々は唯一の列2を見ているためである:4しかしリターンで正しい列名を必要としています。

+3

私はちょうどあなたの時間を計り、100万行のデータフレームで私のコードを実行し、あなたのコードは約1/12の時間で実行されました(中央値0.33秒vs. 4.0秒)。確かにはるかに速いアプローチ。 – eipi10

関連する問題