4

設定

「列」の1つがリストであるリストマトリックスがあります(操作するのは奇妙なデータセットだと思いますが、他の操作に役立つと思います)。リストの各エントリは次のいずれかです。(1) 空 (integer(0))、(2) 整数、または (3) 整数のベクトル。

たとえば、R オブジェクト "df" では、df$ID がインデックス ベクトルで、df$Basket_List がリストです。

ID <- c(1,2,3,4,5,6,7,8,9)
Basket_List <- list(integer(0),c(123,987),c(123,123),456,
                    c(456,123),456,c(123,987),c(987,123),987)
d.f <- data.frame(ID)
d.f$Basket_List <- Basket_List

私の質問

問題1

「Basket_List」に特定の値が含まれているかどうかに基づいて、初期のサブセットである新しいデータセットを作成したいと思います。たとえば、Bask_list が「123」または「123」と「987」を持つような df のすべての行のサブセット、またはその他のより複雑な条件。

次のすべてのバリエーションを試しましたが、役に立ちませんでした。

d.f2 <- subset(d.f, 123 %in% Basket_List)
d.f2 <- subset(d.f, 123 == any(Basket_List))
d.f2 <- d.f[which(123 %in% d.f$Basket_List,]
# should return the subset, with rows 2,3,5,7 & 8

問題2

私のもう 1 つの問題は、この操作を何百万行 (トランザクション データ) に対して実行することになるため、速度を向上させるために可能な限り最適化したいと考えています (現在、複雑な for ループがありますが、時間がかかりすぎる)。


データの代替設定

役に立つと思われる場合は、データを次のように設定することもできます。

ID <- c(1,2,2,3,3,4,5,5,6,7,7,8,8,9)
Basket <- c(NA,123,987,123,123,456,456,123,456,123,987,987,123,987)
alt.d.f <- data.frame(ID,Basket)
4

3 に答える 3

4

@AriB への同様のアプローチは、any演算子を使用してapply、次のように行全体を ing することです。

d.f[ apply( d.f , 1 , function(x) any(unlist(x) %in% 123) ) , ]
#  ID Basket_List
#2  2    123, 987
#3  3    123, 123
#5  5    456, 123
#7  7    123, 987
#8  8    987, 123

データの2番目のセットアップでは、次のように単純にサブセット化できるため、非常に高速になると思います。

df[ df$Basket %in% 123 , ]
#   ID Basket
#NA NA     NA
#2   2    123
#4   3    123
#5   3    123
#8   5    123
#10  7    123
#13  8    123

そして、値を含む行の最初のインスタンスのみが必要な場合は、一意の ID でBasket後で使用できます。これは、最初の引数の最初の一致を 2 番目に返すためです。matchmatch

df2 <- df[ df$Basket %in% 123 , ]
df2[ match( unique(df2$ID) , df2$ID),]
#   ID Basket
#NA NA     NA
#2   2    123
#4   3    123
#8   5    123
#10  7    123
#13  8    123

データの 2 番目のセットアップは、最初のセットアップよりもはるかに高速になると思います。実際、100 万行のテーブルで大まかなベンチマークを行ってみましょう。

DF <- data.frame( ID = sample(ID , 1e6 , repl=TRUE) , Basket = sample(Basket , 1e6 , repl = TRUE) )
df<-DF

system.time({
  df2 <- df[ df$Basket %in% 123 , ]
  df2[ match( unique(df2$ID) , df2$ID),]
})
#   user  system elapsed 
#   0.16    0.00    0.16 

nrow(df)
#[1] 1000000
nrow(df2)
#[1] 428187
于 2013-04-28T21:58:02.947 に答える