我的dataframe 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(..))位在最后_位之后的子串上操作,only位在那部分上操作;它的目的是提取任何以[TYS]开头、后面跟一个或多个数字的子串.

查看前mutate(.)个之后的结果,注意List-Column是什么(不是逗号分隔的字符串列),然后了解下面的unnestmutate是如何清理数据的,这可能是有意义的.


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

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相关问答推荐

检测(并替换)字符串中的数学符号

删除列表中存储的数据帧内和数据帧之间的重复行

是否可以创建一个ggplot与整洁判断的交互作用

计算满足R中条件的连续列

如何通过判断数据框的一列来压缩另一列?

基于数据集属性将科分配给物种

如果COLSUM为>;0,则COLNAME为向量

`-`是否也用于数据帧,有时使用引用调用?

按两个因素将观测值分组后计算单独的百分比

如何判断代码是否在R Markdown(RMD)上下文中交互运行?

如何将EC50值绘制在R中的剂量-react 曲线上?

Ggplot2如何找到存储在对象中的残差和拟合值?

使用R、拼图和可能的网格包绘制两个地块的公共垂直线

排序R矩阵的行和列

将CSV转换为R中的自定义JSON格式

组合名称具有模式的列表的元素

为什么R列名称忽略具有指定名称的向量,而只关注索引?

如何修改Rust中的R字符串并将其赋给新的R变量,并使用extendr保留原始R字符串

如何在分组蜂群小区中正确定位标签

R:部分修改矩阵对角线的有效方法