在R中的strsplit函数中如何去除空格

8
> dc1
  V1                V2
1 20140211-0100     |Box
2 20140211-1782     |Office|Ball
3 20140211-1783     |Office
4 20140211-1784     |Office
5 20140221-0756     |Box
6 20140203-0418     |Box
> strsplit(as.character(dc1[,2]),"^\\|")
[[1]]
[1] ""    "Box"


[[2]]
[1] ""             "Office" "Ball"


[[3]]
[1] ""             "Office"


[[4]]
[1] ""             "Office"


[[5]]
[1] ""    "Box"


[[6]]
[1] ""    "Box"  

如何从strsplit结果中删除空白("")。结果应该看起来像:str1,str2,str3
[[1]]
[1] "Box"
[[2]]
[1] "Office"    "Ball"

你的输出不应该是使用"^\|"所显示的那个,而是[[2]][1] "" "Office|Ball" - Math
7个回答

9
您可以在列表上使用lapply进行检查。我更改了您的strsplit的定义,以匹配您预期的输出。
dc1 <- read.table(text = 'V1                V2
1 20140211-0100     |Box
2 20140211-1782     |Office|Ball
3 20140211-1783     |Office
4 20140211-1784     |Office
5 20140221-0756     |Box
6 20140203-0418     |Box', header = TRUE)

out <- strsplit(as.character(dc1[,2]),"\\|")

> lapply(out, function(x){x[!x ==""]})
[[1]]
[1] "Box"

[[2]]
[1] "Office" "Ball"  

[[3]]
[1] "Office"

[[4]]
[1] "Office"

[[5]]
[1] "Box"

[[6]]
[1] "Box"

4

您可以使用以下方法:

library(stringr)
str_extract_all(dc1[,2], "[[:alpha:]]+")
[[1]]
 [1] "Box"

[[2]]
 [1] "Office" "Ball"  

[[3]]
 [1] "Office"

[[4]]
 [1] "Office"

[[5]]
 [1] "Box"

[[6]]
 [1] "Box"

3

我没有全局解决方案,但是针对您的示例,您可以尝试:

strsplit(sub("^\\|", "", as.character(dc1[,2])),"\\|")

这将删除第一个|(正则表达式"^\\|"的含义),这也是""的原因,然后再执行拆分操作。


2
在这种情况下,您可以通过在sapply中调用"["来仅删除每个向量的第一个元素。
> sapply(strsplit(as.character(dc1[,2]), "\\|"), "[", -1)
# [[1]]
# [1] "Box"

# [[2]]
# [1] "Office" "Ball"  

# [[3]]
# [1] "Office"

# [[4]]
# [1] "Office"

# [[5]]
# [1] "Box"

# [[6]]
# [1] "Box"

2

另一种方法是在将strsplit()的结果展开后,使用nzchar()

out <- unlist(strsplit(as.character(dc1[,2]),"\\|"))

out[nzchar(x=out)] # removes the extraneous "" marks

0
library("stringr")

lapply(str_split(dc1$V2, "\\|"), function(x) x[-1])

[[1]]
[1] "Box"

[[2]]
[1] "Office" "Ball"  

[[3]]
[1] "Office"

[[4]]
[1] "Office"

[[5]]
[1] "Box"

[[6]]
[1] "Box"

0

这篇文章可能有些冷门,但如果能帮助到某个人:

strsplit(as.character(dc1[,2]),"^\\|") %>% 
               lapply(function(x){paste0(x, collapse="")})

这个问题已经有六个现有答案,其中包括一个得到九票的最佳答案。你确定你的解决方案还没有被提出过吗?如果不是,为什么你认为你的方法比已经被社区验证的现有方案更好?在Stack Overflow上提供解释总是有用的,但在问题已经得到OP和社区的满意解决时尤其重要。通过解释你的答案与众不同的地方以及何时可能更受欢迎来帮助读者。 - Jeremy Caney
抱歉Jeremy,我是新手,可能会忽略一些关于stackoverflow的行为细节。根据您的评论,我假设如果一个答案有一定数量的投票,那么没有人应该回复?是的,我应该解释为什么建议不同,会记住这一点。 - Vasco Pereira
您随时欢迎贡献新答案,前提是该主题未被锁定。但是,您应确保您的答案真正为主题做出了新的贡献。一个主题拥有的答案越多,这些答案就越被社区所认可,您真正能够做出新贡献的可能性就越小。无论如何,在这种情况下,通过帮助读者理解您的答案仍然相关的原因是很有用的。例如,也许有新的语法或功能可以利用?您可以编辑您的答案以提供更多细节吗? - Jeremy Caney

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接