1

我正在使用 cSplit 将一列拆分为三个单独的列。分隔符是“/”

但是,我的一个字段嵌入了“/”分隔符。第三行的第三个元素应该是并且在拆分后保持为“f/j”。

当我在以下示例中尝试时,它会创建一个额外的(第四)列

name <- c("abc / efg / hij", "abc / abc / hij", "efg / efg / f/j", "abd / efj / hij")
y <- c(1,1.2,3.4, 5)

dt <- data.frame(name,y)
dt
dt <- cSplit(dt,"name","/", drop=FALSE)
dt

当我在包含超过 5,000 行的原始数据集中尝试它时,会产生以下错误:

fread(x, sep[i], header = FALSE) 中的错误:

预期 3 列,但第 2307 行在处理所有列后包含文本。使用 fill=TRUE 再试一次。另一个原因可能是 fread 在区分一个或多个在不平衡非转义引号内嵌入了 sep='/' 和/或 '\n' 字符的字段的逻辑失败了。如果 quote='' 没有帮助,请提出问题以确定是否可以改进逻辑。

4

2 回答 2

1

如果数据的结构与name向量的结构相同,则可以使用以下内容,这依赖于目标/字符被空白字符包围的想法:

cSplit(dt,"name"," / ", drop=FALSE)

但正如你提到的,这导致了以下错误:

fread(x, sep[i], header = FALSE) 中的错误:“sep”必须是“auto”或单个字符

虽然我无法弄清楚造成这种情况的主要原因,但我认为用/下划线(或与 a 不同的任何其他字符/)替换目标字符,然后在下划线上拆分。以下可以作为说明:

dt$name <- gsub("([^/]+)/([^/]+)/(.*)", "\\1_\\2_\\3", dt$name)
cSplit(dt, "name", "_", drop=F)

#           name   y name_1 name_2 name_3
# 1: abc_efg_hij 1.0    abc    efg    hij
# 2: abc_abc_hij 1.2    abc    abc    hij
# 3: efg_efg_f/j 3.4    efg    efg    f/j
# 4: abd_efj_hij 5.0    abd    efj    hij

我希望这有帮助。

于 2017-09-03T19:04:34.467 回答
0

您应该可以设置fixed = FALSE

cSplit(dt, "name", " / ", fixed = FALSE, drop = FALSE)
##               name   y name_1 name_2 name_3
## 1: abc / efg / hij 1.0    abc    efg    hij
## 2: abc / abc / hij 1.2    abc    abc    hij
## 3: efg / efg / f/j 3.4    efg    efg    f/j
## 4: abd / efj / hij 5.0    abd    efj    hij
于 2017-09-07T15:13:39.037 回答