r - 在复制其他列的同时将一个字符串拆分为 R 中的两行或更多行

标签 r string split

我的数据框 df 的一行中有一个字符串,它在最后一个下划线之后有数字和字母。这些字母可以是 S T 或 Y,其后出现的数字表示蛋白质中发生磷酸化的位置,并且可以有 1 到 9 组。如果有多个字母并且复制了其他列,我希望该字符串被拆分。例如,

# Define the input strings
string1 <- "A01235_414_429_2_2_Y414T418S687"
string2 <- "C2"
string3 <- "C3"

# Create the dataframe
df <- data.frame(Column1 = string1, Column2 = string2, Column3 = string3)

# Print the dataframe
print(df)


# And the new code should yield; 

print(new_df) 


                 Column1 Column2 Column3
1 A01235_414_429_2_2_Y414       C2       C3
2 A01235_414_429_2_2_T418       C2       C3
3 A01235_414_429_2_2_S687       C2       C3

最佳答案

这是一个 dplyr/tidyr 方法:

library(dplyr)
library(tidyr) # unnest
df %>%
  mutate(
    last = sub(".*_", "", Column1),
    mult = regmatches(last, gregexpr("[TYS][0-9]+", last))
  ) %>%
  unnest(mult) %>%
  mutate(Column1 = paste0(sub("_[^_]*$", "_", Column1), mult)) %>%
  select(-last, -mult)
# # A tibble: 3 × 3
#   Column1                 Column2 Column3
#   <chr>                   <chr>   <chr>  
# 1 A01235_414_429_2_2_Y414 C2      C3     
# 2 A01235_414_429_2_2_T418 C2      C3     
# 3 A01235_414_429_2_2_S687 C2      C3     

使用 tidyr::separate_rows 可能(需要更多的正则表达式和更多的工作),但由于没有明确的分隔符,我认为它的代码量与以上(如果不是更多)。

regmatches(last, gregexpr(..)) 位对最后一个 _ 之后的子字符串进行操作,并且该部分;其目的是提取以 [TYS] 开头且后跟一个或多个数字的任何子字符串。

查看第一个 mutate(.) 之后的结果可能会提供很多信息,注意列表列的内容(不是逗号分隔的字符串列),然后了解如何按照 unnestmutate 清理数据。


编辑:这也适用于一个字符串中的重复字母,如

df <- structure(list(Column1 = c("A01235_414_429_2_2_Y414T418S687", "A2A123_1532_1541_2_2_S1532S1535"), Column2 = c("C2", "C2"), Column3 = c("C3", "C3")), class = "data.frame", row.names = c(NA, -2L))
df
#                           Column1 Column2 Column3
# 1 A01235_414_429_2_2_Y414T418S687      C2      C3
# 2 A2A123_1532_1541_2_2_S1532S1535      C2      C3
df %>%
  mutate(
    last = sub(".*_", "", Column1),
    mult = regmatches(last, gregexpr("[TYS][0-9]+", last))
  ) %>%
  unnest(mult) %>%
  mutate(Column1 = paste0(sub("_[^_]*$", "_", Column1), mult)) %>%
  select(-last, -mult)
# # A tibble: 5 × 3
#   Column1                    Column2 Column3
#   <chr>                      <chr>   <chr>  
# 1 A01235_414_429_2_2_Y414    C2      C3     
# 2 A01235_414_429_2_2_T418    C2      C3     
# 3 A01235_414_429_2_2_S687    C2      C3     
# 4 A2A123_1532_1541_2_2_S1532 C2      C3     
# 5 A2A123_1532_1541_2_2_S1535 C2      C3     

关于r - 在复制其他列的同时将一个字符串拆分为 R 中的两行或更多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77728105/

相关文章:

java - 使用 Regex/Split() 有效分割 <endpoint1>,<endpoint2> (?)

r - 如何从 R 脚本中将更改提交到 GitHub?

r - 如何在纬度和经度上从 R 中的 PostGis 转换 Geom 对象?

r - 如何轻松地可视化矩阵?

Javascript 替换功能不适用于正则表达式

python - 如何在 Pandas 数据框单元格中提取部分字符串并在其中创建一个包含该字符串的新列

r - 在 R 中使用 ggplot 扩展 x 限制

java - Karasuba 算法实现 : works for small ns, 因更大的 ns 而中断

c - 大字符串 C/C++ 的优化

c# - 正则表达式正确拆分