R cSplit强制不必要的NA行
我有一个大的数据集,其中一个小样本看起来像下面的4x5Tibble。我尝试使用变量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"
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听到这个消息很遗憾。我只测试了你的示例数据