1

比較的大きなデータセットに data.table を実装しようとしていますが、同じ行の複数の列に対して関数を操作する方法がわかりません。具体的には、特定の形式の値の集計 (つまり、ヒストグラム) を列のサブセットに含む新しい列を作成したいと考えています。これは table() に似ていますが、これにも 0 エントリが含まれており、並べ替えられています。

単純化されたテスト ケース:

DF<-data.frame("A"=c("a","d","a"),"B"=c("b","a","a"),"C"=c("c","a","a"),"D"=c("a","b","c"),"E"=c("a","a","c"))
DT<-as.data.table(DF)
> DT
   A B C D E
1: a b c a a
2: d a a b a
3: a a a c c

私の不格好なヒストグラム関数:

histo<-function(vec){
                     foo<-c("a"=0,"b"=0,"c"=0,"d"=0)
                     for(i in vec){foo[i]=foo[i]+1}
                     return(foo)}
>histo(unname(unlist(DF[1,])))
a b c d
3 1 1 0
>histo(unname(unlist(DF[2,])))
a b c d
3 1 0 1
>histo(unname(unlist(DF[3,])))
a b c d
3 0 2 0

目的の関数と出力の疑似コード

>DT[,his:=some_func_with_histo(A:E)]
>DT
   A B C D E his
1: a b c a a (3,1,1,0)
2: d a a b a (3,1,0,1)
3: a a a c c (3,0,2,0)
4

3 に答える 3

1

注:回答はOPのリクエストとmnelのコメントに更新されました

OK、その解決策はいかがですか:

library(data.table)
DT <- data.table(A=c("a","d","a"),
                 B=c("b","a","a"),
                 C=c("c","a","a"),
                 D=c("a","b","c"),
                 E=c("a","a","c"))

fun <- function(vec, char) {
  sum(vec==char)
}

DT[, Vec_Nr:= paste(Vectorize(fun, 'char')(.SD, letters[1:4]), collapse=","),
   by=1:nrow(DT),
   .SDcols=LETTERS[1:5]]
   A B C D E  Vec_Nr
1: a b c a a 3,1,1,0
2: d a a b a 3,1,0,1
3: a a a c c 3,0,2,0

基本的に、問題をいくつかのステップに分割します。

まず、fun1 文字の出現回数を取得する関数を定義します。その関数がどのように機能するかを確認するには、単に呼び出します

fun(c("a", "a", "b"), "b")
[1] 1

次に、この関数をベクトル化します。1 つの文字 "b" だけではなく、多くの文字について知りたいからです。引数のベクトルを関数に渡すには、 を使用しますVectorize。それがどのように機能するかを確認するには、次のように入力します

Vectorize(fun, "char")(c("a", "a", "b"), c("a", "b"))
a b 
2 1

次に、結果を 1 つの文字列にまとめ、それを新しい列として保存します。これをより動的にする方法を示すために意図的にlettersand を使用したことに注意してください。LETTERS

于 2013-05-30T01:36:38.693 に答える