0

私はこのようなデータセットを持っています

Code   Product
1      A|B
2      A|B|C
3      A|B|C|D|E

Product関数を使用して列を分割するとcolsplit、重複が発生します。関数の出力はcolsplit次のようになります。

Code  Product.1   Product.2  Product.3  Product.4  Product.5
1     A           B          A          B          A
2     A           B          C          A          B
3     A           B          C          D          E

これは、セルの 1 つに 5 つの要素があったために発生します。この重複を避ける方法はありますか?

ありがとう、ジャヤラム

4

1 に答える 1

0

更新 (2013 年 10 月 21 日)

以下の概念はconcat.split.*、私の「splitstackshape」パッケージで呼び出される関数のファミリーに組み込まれています。を使用した非常に簡単なソリューションを次に示しますconcat.split.multiple

library(splitstackshape)
concat.split.multiple(temp, "Product", "|", "long")
#    Code time Product
# 1     1    1       A
# 2     2    1       A
# 3     3    1       A
# 4     1    2       B
# 5     2    2       B
# 6     3    2       B
# 7     1    3    <NA>
# 8     2    3       C
# 9     3    3       C
# 10    1    4    <NA>
# 11    2    4    <NA>
# 12    3    4       D
# 13    1    5    <NA>
# 14    2    5    <NA>
# 15    3    5       E

"long"ワイドフォーマットが必要な場合は引数を削除しますが、コメントは、最終的に出力にロングフォーマットが必要であることを示しています。


元の回答 (2012 年 12 月 17 日)

次のようにstrsplitと を使用してこれを行うことができます。sapply

# Your data
temp <- structure(list(Code = 1:3, Product = c("A|B", "A|B|C", "A|B|C|D|E"
)), .Names = c("Code", "Product"), class = "data.frame", row.names = c(NA, -3L))

temp1 <- strsplit(temp$Product, "\\|") # Split the product cell
temp1 <- data.frame(Code = temp$Code, 
                    t(sapply(temp1, 
                           function(x) { 
                               temp <- matrix(NA, 
                                              nrow = max(sapply(temp1, length)));
                               temp[1:length(x)] <- x; temp})))
temp1
#   Code X1 X2   X3   X4   X5
# 1    1  A  B <NA> <NA> <NA>
# 2    2  A  B    C <NA> <NA>
# 3    3  A  B    C    D    E

または...rbind.fill各行を単一の列にした後、「plyr」パッケージから使用しdata.frameます。

temp1 <- strsplit(temp$Product, "\\|")
library(plyr)
data.frame(Code = temp$Code, 
           rbind.fill(lapply(temp1, function(x) data.frame(t(x)))))
#   Code X1 X2   X3   X4   X5
# 1    1  A  B <NA> <NA> <NA>
# 2    2  A  B    C <NA> <NA>
# 3    3  A  B    C    D    E

または... @DWinのすばらしい答えhereに触発されて、2番目の列をdata.frameそれ自体として読み直してください。

newcols <- max(sapply(strsplit(temp$Product, "\\|"), length))
temp2 <- data.frame(Code = temp$Code,
                    read.table(text = as.character(temp$Product), 
                               sep="|", fill=TRUE, 
                               col.names=paste("Product", seq(newcols))))
temp2
#   Code Product.1 Product.2 Product.3 Product.4 Product.5
# 1    1         A         B                              
# 2    2         A         B         C                    
# 3    3         A         B         C         D         E
于 2012-12-17T10:52:30.453 に答える