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

50few1ms  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(101)

我有一个字符串在一行我的框架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

字符串

zhte4eai

zhte4eai1#

下面是一个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如何清理数据,可能会提供信息。

  • 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

hfsqlsce

hfsqlsce2#

你可以尝试

pat <- "[YTS]\\d+"
df %>%
    mutate(Column1 = list(str_c(
        gsub(pat, "", Column1),
        str_extract_all(Column1, pat, TRUE)
    ))) %>%
    unnest(Column1)

字符串
这给

# 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

相关问题