3

クラス列といくつかの値列を持つdata.tableがあります。

     class  v1  v2  v3
1:       1  10   3   8
2:       2   2  24   7
3:       1  70   3   9

ここで、data.tableのサブセット(class=1 など) について、順列に従って各行の値の順序を変更する必要があります。たとえば、順列が

3   1   2

結果は次のようになります

     class  v1  v2  v3
1:       1   8  10   3
2:       2   2  24   7
3:       1   9  70   3

data.table を使用してこれを達成する最善の方法は何ですか?

より効率的であれば、データをマトリックスに変換することもできます。ありがとう!

4

2 に答える 2

2

このようなものが動作するはずです

 DT <- data.table(class = sample(1:3, 10, TRUE), v1 =sample(10), v2 = sample(10), v3 = sample(10))
 DT
    class v1 v2 v3
 1:     1  4  6  6
 2:     1  7  1  5
 3:     1  5  5 10
 4:     1  3  8  7
 5:     3  8  4  3
 6:     3  9  7  9
 7:     2  1  3  8
 8:     2 10 10  2
 9:     1  2  2  4
10:     2  6  9  1

# the neworder column contains the new permutations
swapcols <- data.table(class = 1:3, neworder = list(c(1,2,3), c(3,1,2),c(1,3,2)))

setkey(DT, class)
setkey(swapcols, class)

DT[swapcols, setNames(list(v1,v2,v3)[unlist(neworder)], c('v1','v2','v3'))]

    class v1 v2 v3
 1:     1  4  6  6
 2:     1  7  1  5
 3:     1  5  5 10
 4:     1  3  8  7
 5:     1  2  2  4
 6:     2  8  1  3
 7:     2  2 10 10
 8:     2  1  6  9
 9:     3  8  3  4
10:     3  9  9  7

おそらく、次のようなことを行うとさらに効率的です

  DT[swapcols, setcolorder(.SD, unlist(neworder))]

また

  new <- DT[swapcols, list(v1,v2,v3)[unlist(neworder)]]
  setnames(new, names(new), c('class', c('v1','v2','v3'))

を使用することもできます:=。何かのようなもの

 DT[J(1), `:=`(v1= v2,v2=v3,v3=v1)]

関数内でこれを自動化する方法を試すことができますが、それは eval / parse と do.call の混乱になります。


マシューから(v1.8.3でテスト済み):

DT = data.table(class=c(1,2,1),v1=c(10,2,70),v2=c(3,24,3),v3=c(8,7,9))
DT
   class v1 v2 v3
1:     1 10  3  8
2:     2  2 24  7
3:     1 70  3  9

perm = c(3,1,2)
DT[class==1, names(DT)[-1L] := .SD, .SDcols = perm+1L]]
DT
   class v1 v2 v3
1:     1  8 10  3
2:     2  2 24  7
3:     1  9 70  3
于 2012-10-29T22:19:12.950 に答える
0

class 2結果が行を含むことを意図していなかったと仮定しています。

かなり単純な解決策:

df.new <- subset(df, class=1)
df.new <- df.new[,c(1,4,2,3)]

または、一度にすべてを実行できます。

df.new <- df[df$class==2,c("class","v3","v1","v2")]
于 2012-10-29T22:17:11.893 に答える