use*_*485 5 string split r delimiter
当我在 R 中有不同数量的相同分隔符时,我需要帮助弄清楚如何根据最后一个分隔符在数据框的列中拆分字符串。例如,
col1 <- c('a', 'b', 'c')
col2 <- c('a_b', 'a_b_c', 'a_b_c_d')
df <- data.frame(cbind(col1, col2))
Run Code Online (Sandbox Code Playgroud)
我想拆分 df$col2 以获得如下所示的数据框:
col1 <- c('a', 'b', 'c')
col2 <- c('a', 'a_b', 'a_b_c')
col3 <- c('b', 'c', 'd')
Run Code Online (Sandbox Code Playgroud)
使用该stringi
包,您也可以实现您的目标。stri_extract_last_regex()
提取您在模式中指定的最后一个元素。在这里,我说“获取字符串中的最后一个小字母”。同样,您可以使用stri_replace_last_regex()
来修改col2
. 这里我说“我想把最后一个模式_和一个小字母什么都替换掉”。也就是说,我说“我想删除最后一个模式_和一个小字母”。
library(dplyr)
library(stringi)
df %>%
mutate(col3 = stri_extract_last_regex(str = col2, pattern = "[a-z]"),
col2 = stri_replace_last_regex(str = col2, pattern = "_[a-z]", replacement = ""))
# col1 col2 col3
#1 a a b
#2 b a_b c
#3 c a_b_c d
Run Code Online (Sandbox Code Playgroud)
这些不使用包。他们假设 的每个元素col2
至少有一个下划线。(如果需要取消此限制,请参阅注释。)
1)第一个正则表达式(.*)_
匹配最后一个下划线之前的所有内容,后跟剩余的所有内容.*
,第一个正则sub
表达式用括号内的匹配部分替换整个匹配。这是有效的,因为这样的匹配是贪婪的,所以第一个匹配.*
会拿走它能得到的一切,把剩下的留给第二个匹配.*
。第二个正则表达式匹配最后一个下划线之前的所有内容,第二个正则表达式sub
将其替换为空字符串。
transform(df, col2 = sub("(.*)_.*", "\\1", col2), col3 = sub(".*_", "", col2))
Run Code Online (Sandbox Code Playgroud)
2)这是一个更加对称的变体。它对这两个调用使用相同的正则表达式sub
。
pat <- "(.*)_(.*)"
transform(df, col2 = sub(pat, "\\1", col2), col3 = sub(pat, "\\2", col2))
Run Code Online (Sandbox Code Playgroud)
注意:如果我们确实想处理完全没有下划线的字符串,以便将“xyz”拆分为“xyz”和“”,则将其用于第二个sub
。它尝试匹配 | 的左侧 首先,如果失败(如果没有下划线就会发生这种情况),那么整个字符串将与右侧匹配,并将sub
其替换为空字符串。
sub(".*_|^[^_]*$", "", col2)
Run Code Online (Sandbox Code Playgroud)