2016-06-22 4 views
0

column1に同じ値を持ち、column2のマージを適切にフォーマットするにはどうすればよいですか(例を参照)列1の2つの類似行を結合し、rの2番目の列テキストをマージする

入力:

> df 
     COL1 COL2 
    1 b21 blabla1 
    2 b21 blabla2 
    3 b55 sdlafk 

所望の出力(B21が1行にまとめているので、2行目):

 COL1 COL2 
    1 b21 blabla1 
      blabla2 
    2 b55 sdlafk 

ソース

df <- structure(list(COL1 = structure(c(1L, 1L, 2L), .Label = c("b21", 
"b55"), class = "factor"), COL2 = structure(1:3, .Label = c("blabla1", 
"blabla2", "sdlafk"), class = "factor")), .Names = c("COL1", 
"COL2"), class = "data.frame", row.names = c(NA, -3L)) 
+0

あなたはまだdata.frameをしたいですか? 'Col2'の値を一緒に貼り付けるか、' col1'が同じであればリストに入れますか? – Psidom

+0

任意のソリューションは歓迎です – S12000

答えて

0

あなたはCol2がに格納したい場合リスト:

data.table::setDT(df)[, .(COL2 = list(COL2)), .(COL1)] 
    COL1   COL2 
1: b21 blabla1,blabla2 
2: b55   sdlafk 

あなたは文字に変換したい場合:あなたは、ベースRを使用することができます

data.table::setDT(df)[, .(COL2 = paste(COL2, collapse = ",")), .(COL1)] 
    COL1   COL2 
1: b21 blabla1,blabla2 
2: b55   sdlafk 

:あなたの目標は(ストレージ対プレゼンテーション)であるものに応じて

aggregate(COL2 ~ COL1, df, paste, collapse = ",") 
    COL1   COL2 
1 b21 blabla1,blabla2 
2 b55   sdlafk 
0

いくつかのオプションを、:

df <- data.frame(COL1 = c("b21", "b21", "b55"), 
        COL2 = c("blabla1", "blabla2", "sdlafk")) 

シンプルリスト:

split(df$COL2, df$COL1) 
# $b21 
# [1] "blabla1" "blabla2" 
# $b55 
# [1] "sdlafk" 

プレゼンテーションのみ:

within(df, { COL1 = ifelse(duplicated(COL1), "", COL1) }) 
# COL1 COL2 
# 1 b21 blabla1 
# 2  blabla2 
# 3 b55 sdlafk 

dplyr(Psidomのdata.table @補完するために):

library(dplyr) 
df %>% 
    group_by(COL1) %>% 
    summarize(COL2 = paste(COL2, collapse = ",")) 
# Source: local data frame [2 x 2] 
# COL1   COL2 
# <chr>   <chr> 
# 1 b21 blabla1,blabla2 
# 2 b55   sdlafk 
関連する問題