我的数据框 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(.)
之后的结果可能会提供很多信息,注意列表列的内容(不是逗号分隔的字符串列),然后了解如何按照 unnest
和 mutate
清理数据。
编辑:这也适用于一个字符串中的重复字母,如
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/