r - 在 R 中,如何拆分向量中的每个字符串以返回第 N 个字符实例之前的所有内容?

标签 r sapply strsplit

例子:

 df <- data.frame(Name = c("J*120_234_458_28", "Z*23_205_a834_306", "H*_39_004_204_99_04902"))

我希望能够为数据框中的每一行选择第三个下划线之前的所有内容。我了解如何拆分字符串:

df$New <- sapply(strsplit((df$Name),"_"), `[`)

但这会在每一行中放置一个列表。到目前为止,我一直无法弄清楚如何使用 sapply to unlist() df$New 的每一行选择列表的前 N ​​个元素以将它们粘贴/折叠在一起。因为每个子元素的长度可以不同,子元素的数量也可以不同,所以我一直无法找到获取此信息的替代方法。

最佳答案

我们在拆分 character 之后指定 'n'按“_”列,提取n-1第一个组件

 n <- 4
 lapply(strsplit(as.character(df$Name), "_"), `[`, seq_len(n - 1))

如果我们需要paste它一起,可以在遍历 function(x) 之后使用匿名函数调用( list )与 lapply/sapply , 用 head 得到前 n 个元素和 paste他们在一起`

sapply(strsplit(as.character(df$Name), "_"), function(x) 
          paste(head(x, n - 1), collapse="_"))
#[1] "J*120_234_458" "Z*23_205_a834" "H*_39_004"   

或者使用正则表达式的方法

sub("^([^_]+_[^_]+_[^_]+)_.*", "\\1", df$Name)
#[1] "J*120_234_458" "Z*23_205_a834" "H*_39_004" 

或者如果'n'真的很大,那么

pat <- sprintf("^([^_]+){%d}[^_]+).*", n-1)
sub(pat, "\\1", df$Name) 

或者

sub("^(([^_]+_){2}[^_]+)_.*", "\\1", df$Name)
#[1] "J*120_234_458" "Z*23_205_a834" "H*_39_004"    

关于r - 在 R 中,如何拆分向量中的每个字符串以返回第 N 个字符实例之前的所有内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60497837/

相关文章:

r - 如何指定在 R 的 mapply 中迭代哪些参数

r - 拆分R中不同列中的值

R:ggplot 设置带有自定义中断的 ylim

r - facet_wrap() + ggplot2() 中每个面的独立颜色渐变

r - 寻求一种更干净的方法来避免嵌套 if 语句(使用 sapply)

dataframe - 使用 OPTIM() 将附加列更改为现有数据框或 tibble

r - 如何从字符对象创建字符向量?

r - 将列分成 2 并用数字替换字符 - R

r - 移动 Lollipop R

r - 从 R 中的对象中提取值(无法通过 "str"获得)