拆分一列的行,然后用第二个元素 R 创建一列

split rows of a column then make a column with the 2nd element R

这对我来说很难,所以请帮助我。我有一个 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])'

一种方法是通过 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+")

这个解决方案利用正向后视:这部分正则表达式 (?<=x) 体现了指令 "if in the string you see on the left an x",而这部分正则表达式 \d+ 匹配重复一个或多个的数字次。

另一个base R解决方案是通过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

您可以独立于 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