R 在单元格中拆分数据

R 在单元格中拆分数据,r,dataframe,R,Dataframe,我有一个像这样的数据集 Code Product 1 A|B 2 A|B|C 3 A|B|C|D|E 当我使用colsplit函数拆分列Product时,会发生重复。colsplit函数的输出如下所示: Code Product.1 Product.2 Product.3 Product.4 Product.5 1 A B A B A 2 A

我有一个像这样的数据集

Code   Product
1      A|B
2      A|B|C
3      A|B|C|D|E
当我使用
colsplit
函数拆分列
Product
时,会发生重复。
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
这是因为其中一个细胞含有五种元素。有没有办法避免这种重复

谢谢和问候 Jayaram更新(2013年10月21日) 在我的“splitstackshape”软件包中,下面的概念已被集成到名为
concat.split.*
的函数族中。下面是一个非常简单的解决方案,使用
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

或者。。。将每一行放入一列
data.frame
后,使用“plyr”包中的
rbind.fill

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

您希望输出是宽格式还是长格式?宽格式的第一行是
A,B,NA,NA,NA
,长格式的第一行是
1,1,A
1,2,B
。宽格式是合适的,因为需要进行更多的转换。如果你能给我所需的代码和函数,那将非常有帮助。还有更多的要求吗?是否有代码可以避免不需要的单元格中出现NA?感谢所有的帮助。代码工作正常。是否有方法删除单元格中的NA?否。
data.frame
的所有行必须具有相同的列数,因此每当单元格中没有输入值时,就会使用
NA
。我建议改为使用列表,尝试
strsplit(x$Product,\\\\\”)
@ananda-mahto,因为输出的格式很宽。是否可以更改功能,使输出处于长时间模式format@jayaram8569,您可以在附加步骤中执行此操作。假设您使用了
concat.split
函数,并将输出存储为
temp1
,您可以尝试:
重塑(temp1,direction=“long”,idvar=“code”,variang=2:ncol(temp1),sep=“”)
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
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