首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将字符串拆分为R中的新行

将字符串拆分为R中的新行
EN

Stack Overflow用户
提问于 2014-08-20 09:42:19
回答 3查看 9K关注 0票数 5

我有如下数据集:

代码语言:javascript
复制
Country Region    Molecule      Item Code   
    IND     NA       PB102      FR206985511 
   THAI     AP       PB103      BA-107603 / F000113361 / 107603
   LUXE     NA       PB105      1012701 / SGP-1012701 / F041701000
    IND     AP       PB106      AU206985211 / CA-F206985211
   THAI     HP       PB107      F034702000 / 1010701 / SGP-1010701
   BANG     NA       PB108      F000007970/25781/20009021

我希望将ITEMCODE列中的字符串值拆分到/上,并为每个条目创建一个新行。

例如,所需的输出将是:

代码语言:javascript
复制
Country Region Molecule      Item.Code
    IND     NA    PB102    FR206985511
   THAI     AP    PB103      BA-107603
   THAI     AP    PB103     F000113361
   THAI     AP    PB103         107603
   LUXE     NA    PB105        1012701
   LUXE     NA    PB105    SGP-1012701
   LUXE     NA    PB105     F041701000
    IND     AP    PB106    AU206985211
    IND     AP    PB106  CA-F206985211
   THAI     HP    PB107     F034702000
   THAI     HP    PB107        1010701
   THAI     HP    PB107    SGP-1010701
   BANG     NA    PB108     F000007970
   BANG     NA    PB108          25781
   BANG     NA    PB108       20009021

我尝试了下面的代码

代码语言:javascript
复制
library(splitstackshape)
df2=concat.split.multiple(df1,"Plant.Item.Code","/", direction="long")

但得到了错误

代码语言:javascript
复制
"Error: memory exhausted (limit reached?)"

当我尝试strsplit()时,我得到了下面的错误消息。

代码语言:javascript
复制
Error in strsplit(df1$Plant.Item.Code, "/") : non-character argument
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-08-20 09:58:31

尝试cSplit函数(因为您已经使用了@Anandas包)。注意,is将返回一个data.table对象,因此请确保安装了此包。您可以通过执行类似于data.frame的操作(如果愿意)恢复到setDF(df2)

代码语言:javascript
复制
library(splitstackshape)
df2 <- cSplit(df1, "Item.Code", sep = "/", direction = "long")
df2
#     Country Region Molecule      Item.Code
#  1:     IND     NA    PB102    FR206985511
#  2:    THAI     AP    PB103      BA-107603 
#  3:    THAI     AP    PB103     F000113361 
#  4:    THAI     AP    PB103         107603
#  5:    LUXE     NA    PB105        1012701 
#  6:    LUXE     NA    PB105    SGP-1012701 
#  7:    LUXE     NA    PB105     F041701000
#  8:     IND     AP    PB106    AU206985211 
#  9:     IND     AP    PB106  CA-F206985211
# 10:    THAI     HP    PB107     F034702000 
# 11:    THAI     HP    PB107        1010701 
# 12:    THAI     HP    PB107    SGP-1010701
# 13:    BANG     NA    PB108     F000007970
# 14:    BANG     NA    PB108          25781
# 15:    BANG     NA    PB108       20009021
票数 18
EN

Stack Overflow用户

发布于 2014-08-25 19:37:08

R基的另一种方法:

代码语言:javascript
复制
as.data.frame(do.call(rbind, apply(df1, 1, function(x) {
      do.call(expand.grid, strsplit(x, " */ *"))
})))

结果:

代码语言:javascript
复制
   Country Region Molecule     Item.Code
1      IND   <NA>    PB102   FR206985511
2     THAI     AP    PB103     BA-107603
3     THAI     AP    PB103    F000113361
4     THAI     AP    PB103        107603
5     LUXE   <NA>    PB105       1012701
6     LUXE   <NA>    PB105   SGP-1012701
7     LUXE   <NA>    PB105    F041701000
8      IND     AP    PB106   AU206985211
9      IND     AP    PB106 CA-F206985211
10    THAI     HP    PB107    F034702000
11    THAI     HP    PB107       1010701
12    THAI     HP    PB107   SGP-1010701
13    BANG   <NA>    PB108    F000007970
14    BANG   <NA>    PB108         25781
15    BANG   <NA>    PB108      20009021
票数 9
EN

Stack Overflow用户

发布于 2014-08-20 09:58:41

试试像这样的东西

代码语言:javascript
复制
d <- structure(list(Country = c("A", "B", "C"), `Item Code` = c("FR206985511", 
    "BA-107603/F000113361/107603", "1012701/SGP-1012701/F041701000")),
    .Names = c("Country", "Item Code"), row.names = c(NA, -3L),
    class = "data.frame")
d
#   Country                      Item code
#         A                    FR206985511
#         B    BA-107603/F000113361/107603
#         C 1012701/SGP-1012701/F041701000

codes <- strsplit(d$"Item Code", "/")
code.lengths <- sapply(codes, length)
new.d <- d[rep(1:nrow(d), code.lengths), ]
new.d$"Item Code" <- unlist(codes)
new.d 
#    Country   Item Code
#1         A FR206985511
#2         B   BA-107603
#2.1       B  F000113361
#2.2       B      107603
#3         C     1012701
#3.1       C SGP-1012701
#3.2       C  F041701000

如果您想去掉空格(原始数据似乎包含这些空间),可以通过d$"Item Code" <- gsub(" ", "", d$"Item Code")来完成。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25401505

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档