R cSplit强制不必要的NA行

R cSplit强制不必要的NA行,r,string,delimiter,splitstackshape,csplit,R,String,Delimiter,Splitstackshape,Csplit,我有一个大的数据集,其中一个小样本看起来像下面的4x5Tibble。我尝试使用变量c==“split”将多个分隔列拆分为唯一的行,如下所示: library(splitstackshape) dt <- tibble( a = c("Quartz | White Spirit | Wildfire", "Quiet Riot", "Race Against Time", "Down | Heart Lane | X | Breaking H"), b = c("Muthas Pride"

我有一个大的数据集,其中一个小样本看起来像下面的4x5Tibble。我尝试使用变量
c==“split”
将多个分隔列拆分为唯一的行,如下所示:

library(splitstackshape)

dt <- tibble(
a = c("Quartz | White Spirit | Wildfire", "Quiet Riot", "Race Against Time", "Down | Heart Lane | X | Breaking H"),
b = c("Muthas Pride", "Killer Girls / Slick Black Cadillac", "Demo 1980", "Life 55"),
c = c("Split", "Single", "Demo", "Split"),
d = c("Birmingham, England | Hartlepool, England | Sheffield, South Yorkshire, England", "Los Angeles, California", "Nottingham, England", "Liverpool | Beijing | | NYC"),
e = c("wf | ef | ff", "g", "f", "cf | af | df | rf")
)

dt.s <- subset(dt, c == "Split")
dt.split <- cSplit(dt.s, c("a", "d", "e"), c("|", "|", "|"), "long") 
dt.split

如果我只拆分两列,这不是问题。如何使其不产生NA行?还有,有没有一种方法可以使
cSplit
在不使用
c
子集的情况下工作?

当我们使用
tible
时,我们可以使用
单独的行
,而不是给出
NA

library(tidyr)
separate_rows(dt.s, c('a', "d", "e"), sep="\\s*\\|\\s*") %>%
         select_at(names(dt.s))
# A tibble: 7 x 5
#             a            b     c                                   d     e
#         <chr>        <chr> <chr>                               <chr> <chr>
#1       Quartz Muthas Pride Split                 Birmingham, England    wf
#2 White Spirit Muthas Pride Split                 Hartlepool, England    ef
#3     Wildfire Muthas Pride Split Sheffield, South Yorkshire, England    ff
#4         Down      Life 55 Split                           Liverpool    cf
#5   Heart Lane      Life 55 Split                             Beijing    af
#6            X      Life 55 Split                                        df
#7   Breaking H      Life 55 Split                                 NYC    rf

在这里,我们发现对于第二行,分隔符的数量,即
|
是4,为第一行创建一个
NA
,因为“a”列只有3个分隔符。因此,当我们使用“long”格式时,该
NA
行会传播。这可能是一个bug。

因为我们使用的是
tibble
,所以我们可以使用
单独的行
,这不会给出
NA

library(tidyr)
separate_rows(dt.s, c('a', "d", "e"), sep="\\s*\\|\\s*") %>%
         select_at(names(dt.s))
# A tibble: 7 x 5
#             a            b     c                                   d     e
#         <chr>        <chr> <chr>                               <chr> <chr>
#1       Quartz Muthas Pride Split                 Birmingham, England    wf
#2 White Spirit Muthas Pride Split                 Hartlepool, England    ef
#3     Wildfire Muthas Pride Split Sheffield, South Yorkshire, England    ff
#4         Down      Life 55 Split                           Liverpool    cf
#5   Heart Lane      Life 55 Split                             Beijing    af
#6            X      Life 55 Split                                        df
#7   Breaking H      Life 55 Split                                 NYC    rf

在这里,我们发现对于第二行,分隔符的数量,即
|
是4,为第一行创建一个
NA
,因为“a”列只有3个分隔符。因此,当我们使用“long”格式时,该
NA
行会传播。这可能是一个bug。

尝试将
makeEqual=FALSE
添加到您的
cSplit
调用中:

cSplit(dt.s, c("a", "d", "e"), "|", "long", makeEqual = FALSE)
##               a            b     c                                   d  e
## 1:       Quartz Muthas Pride Split                 Birmingham, England wf
## 2: White Spirit Muthas Pride Split                 Hartlepool, England ef
## 3:     Wildfire Muthas Pride Split Sheffield, South Yorkshire, England ff
## 4:         Down      Life 55 Split                           Liverpool cf
## 5:   Heart Lane      Life 55 Split                             Beijing af
## 6:            X      Life 55 Split                                     df
## 7:   Breaking H      Life 55 Split                                 NYC rf
此外,由于您已经在使用“tidyverse”中的包,您可以将其子集与拆分一起使用,如下所示:

dt %>% 
  filter(c == "Split") %>% 
  cSplit(c("a", "d", "e"), "|", "long", makeEqual = FALSE)

尝试将
makeEqual=FALSE
添加到您的
cSplit
调用:

cSplit(dt.s, c("a", "d", "e"), "|", "long", makeEqual = FALSE)
##               a            b     c                                   d  e
## 1:       Quartz Muthas Pride Split                 Birmingham, England wf
## 2: White Spirit Muthas Pride Split                 Hartlepool, England ef
## 3:     Wildfire Muthas Pride Split Sheffield, South Yorkshire, England ff
## 4:         Down      Life 55 Split                           Liverpool cf
## 5:   Heart Lane      Life 55 Split                             Beijing af
## 6:            X      Life 55 Split                                     df
## 7:   Breaking H      Life 55 Split                                 NYC rf
此外,由于您已经在使用“tidyverse”中的包,您可以将其子集与拆分一起使用,如下所示:

dt %>% 
  filter(c == "Split") %>% 
  cSplit(c("a", "d", "e"), "|", "long", makeEqual = FALSE)

谢谢,但是在数据集上运行上述代码(不是上面的示例)会产生以下错误:
错误:所有嵌套列必须具有相同数量的元素。
@1984听到这个消息很抱歉。我只在您的示例数据上进行了测试,谢谢,但是在数据集上运行上述代码(不是上面的示例)会产生以下错误:
error:所有嵌套列必须具有相同数量的元素。
@1984听到这个消息很遗憾。我只测试了你的示例数据