【问题标题】:split rows of a column then make a column with the 2nd element R拆分一列的行,然后用第二个元素 R 组成一列
【发布时间】:2020-08-20 10:26:52
【问题描述】:

这对我来说很难,所以请帮助我。我有一个看起来像这样的 df:

    col1      col2    col3
ccd_x29807 Gly_GCC_89 0.3
ccd_x29807 Gly_GCC_87 0.3
ccd_x29807 Gly_GCC_88 0.3
ccd_x20463 Lys_CTT_12 0.1

我想要做的是将值(在x 之后)保存在一个新列中。所以输出应该是这样的:

    col1      col2   col3 col4
ccd_x29807 Gly_GCC_89 0.3 29807
ccd_x29807 Gly_GCC_87 0.3 29807
ccd_x29807 Gly_GCC_88 0.3 29807
ccd_x20463 Lys_CTT_12 0.1 20463

我试过这个,但它把29807 放在所有行中:

df1$col1 %>% 
  mutate(col4 = str_split(samples, "x")[[1]][2])'

【问题讨论】:

  • @markus 不,它是可变的。这些是来自不同记录的计数。

标签: r regex dataframe split strsplit


【解决方案1】:

您可以与 tidyr 包分开使用。

library(tidyr)

df <- data.frame(
  col1 = c("ccd_x29807", "ccd_x29807", "ccd_x29807", "ccd_x20463"),
  col2 = c("Gly_GCC_89", "Gly_GCC_87", "Gly_GCC_88", "Lys_CTT_12"),
  col3 = c(0.3, 0.3, 0.3, 0.1)
)

df %>%
  mutate(col_temp = col1) %>%
  separate("col_temp", into = c(NA, "col4"), sep = "x")

输出:

        col1       col2 col3  col4
1 ccd_x29807 Gly_GCC_89  0.3 29807
2 ccd_x29807 Gly_GCC_87  0.3 29807
3 ccd_x29807 Gly_GCC_88  0.3 29807
4 ccd_x20463 Lys_CTT_12  0.1 20463

【讨论】:

    【解决方案2】:

    一种方法是通过stringrs 函数str_extract

    数据:

    df <- data.frame(col1 = c("ccd_x29807","ccd_x29807","ccd_x29807","ccd_x20463"))
    

    解决方案:

    df$col2 <- str_extract_all(df$col1, "(?<=x)\\d+")
    

    此解决方案利用正向后视:这部分正则表达式 (?&lt;=x) 体现了指令“如果在左侧看到的字符串中出现 x”,而这部分正则表达式 \\d+ 匹配一个数字重复一次或多次。

    另一个base Rsolution 是通过gsub和反向引用\\1

    df$col2 <- gsub(".*x(\\d+)", "\\1", df$col1)
    

    或者,如果您更喜欢dplyr

    df$col2 <- df %>% 
      mutate(col1 = str_extract_all(col1, "(?<=x)\\d+"))
    

    结果:

    df
            col1  col2
    1 ccd_x29807 29807
    2 ccd_x29807 29807
    3 ccd_x29807 29807
    4 ccd_x20463 20463
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-14
      • 2019-11-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多