3

非常に単純な形式のデータ フレームがあります。

    X Y
    ---
    A 1
    A 2
    B 3
    C 1
    C 3

私の最終結果は次のようなリストになるはずです:

$`A`
[1] 1 2

$`B`
[1] 3

$`C`
[1] 1 3

この操作では、R で split() 関数を使用しています。

k <- split(Y, X)

これはうまく機能しています。ただし、X の 1,000 万のグループと Y の 387,000 の値を含む 2,200 万行を含むデータ フレームにこのコードを適用すると、非常に時間がかかります。MKL対応のRRO 8.0オープン版を使ってみました。ただし、使用されるカーネルは 1 つだけです。CPU には 64 GB の RAM が搭載されているため、問題になることはありません。

これを計算するためのよりスマートな方法についてのアイデアはありますか?

4

2 に答える 2

5

試す

 library(data.table)
 DT <- as.data.table(df)
 DT1 <- DT[, list(Y=list(Y)), by=X]
 DT1$Y
 #[[1]]
 #[1] 1 2

 #[[2]]
 #[1] 3

 #[[3]]
 #[1] 1 3

または使用してdplyr

 library(dplyr)
 df1 <-  df %>% 
             group_by(X) %>%
              do(Y=c(.$Y))

 df1$Y
 #[[1]]
 #[1] 1 2

 #[[2]]
 #[1] 3

 #[[3]]
 #[1] 1 3

データ

 df <- structure(list(X = c("A", "A", "B", "C", "C"), Y = c(1L, 2L, 
 3L, 1L, 3L)), .Names = c("X", "Y"), class = "data.frame", row.names = c(NA, 
 -5L))
于 2014-12-04T15:42:50.410 に答える
2

dplyr および/または data.table の同様のコードを使用して、エレガントなソリューションを見つけました。Rで連結グループを探したところ、次の投稿が見つかりました。

R のグループごとに、1 つの列内の文字コンテンツを効率的に連結する

そして実際、それは非常にうまく機能します

dt = data.table(content = sample(letters, 26e6, T), groups = LETTERS)
df = as.data.frame(dt)

system.time(dt[, paste(content, collapse = " "), by = groups])
#   user  system elapsed 
#   5.37    0.06    5.65 

system.time(df %>% group_by(groups) %>% summarise(paste(content, collapse = " ")))
#   user  system elapsed 
#   7.10    0.13    7.67 

ご助力いただきありがとうございます

于 2015-02-09T13:51:28.437 に答える