在 R 中连接字符向量,其中某些元素具有 0 个字符
Concatenate character vectors in R where some elements have 0 characters
我有字符向量,其中一些元素有 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"
编辑:上面是一个简化的例子,这是一个更好的近似值(我将评论连接到单个字段)
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 但给出相同结果的解决方案感兴趣。
您可以 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"
这是一个使用 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"
注意:OP 在 'x' 中的输入字符串是 alpah
。
我有字符向量,其中一些元素有 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"
编辑:上面是一个简化的例子,这是一个更好的近似值(我将评论连接到单个字段)
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 但给出相同结果的解决方案感兴趣。
您可以 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"
这是一个使用 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"
注意:OP 在 'x' 中的输入字符串是 alpah
。