【问题标题】:Concatenate character vectors in R where some elements have 0 characters连接 R 中的字符向量,其中某些元素有 0 个字符
【发布时间】:2016-10-02 00:10:12
【问题描述】:

我有字符向量,其中一些元素有 0 个字符。我想连接它们,但忽略这 0 个元素:

x <- c("a", "b", "", "d", "", "f")
y <- c("a", "", "c", "", "e", "f")
z <- c("a", "", "c", "d", "", "f")

paste(x, y, z, sep = ":")
# This gives:
# [1] "a:a:a" "b::"   ":c:c"  "d::d"  ":e:"   "f:f:f"

# But I want this:

# "a:a:a" "b"   "c:c"  "d:d"  "e"   "f:f:f"

编辑:上面是一个简化的例子,这是一个更好的近似值(我将 cmets 连接到单个字段)

x <- c("alpah beta", "better", "", "delta", "")
y <- c("alpha", "", "c", "", "fox, one")
z <- c("alpha", "", "can of worms", "delta", "")

paste(x, y, z, sep = "; ")
# Gives:
# "alpha beta; alpha; alpha" "better; ; " "; c; can of worms" "delta; ; delta" "; fox, one; "

# required
# "alpha beta; alpha; alpha"  "better"  "c; can of worms"  "delta; delta"  "fox, one"

我也对一个解决方案感兴趣,该解决方案可以将“”替换为 NA,但结果相同。

【问题讨论】:

  • 可以对输出进行后处理以从字符串的开头或结尾删除 :: 或 :。

标签: r string character concatenation paste


【解决方案1】:

您可以将它们paste0 一起忽略空格,然后将strsplit 每个字符和paste 重新组合在一起,与: 折叠。

sapply(strsplit(paste0(x,y,z),""),paste,collapse=":")
[1] "a:a:a" "b"     "c:c"   "d:d"   "e"     "f:f:f"

更新示例

另一种方法是使用Reduce 和自定义函数来检查空白元素:

Reduce(function (x,y) ifelse(x==""|y=="",paste0(x,y),paste(x,y,sep=":")),list(x,y,z))
[1] "alpah beta:alpha:alpha" "better"                 "c:can of worms"        
[4] "delta:delta"            "fox, one"

【讨论】:

  • 谢谢,我简化了示例,但是当字符向量中有单词或句子时,这将不起作用。我将编辑问题。
  • @CCID 我添加了另一种适用于新示例的方法
【解决方案2】:

这是一个使用gsub的选项

gsub("^:+|:+$|:(?=:)", "", paste(x, y, z, sep = ":"), perl = TRUE)
#[1] "a:a:a" "b"     "c:c"   "d:d"   "e"     "f:f:f"

更新

上面的代码也应该适用于更新的示例(因为 OP 更改了分隔符,我们也在更改它)

gsub("^; |; $|; (?=;)", "", paste(x, y, z, sep = "; "), perl = TRUE)
#[1] "alpah beta; alpha; alpha" "better"                  
#[3] "c; can of worms"          "delta; delta"            
#[5] "fox, one"                

注意:'x' 中 OP 的输入字符串是 alpah

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多