将一列的行拆开,然后用第2个元素R组成一列。

问题描述 投票:0回答:1

这可难坏了我,请大家帮帮我。我有一个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])'
r regex dataframe split strsplit
1个回答
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

0
投票

一种方法是通过 stringr的功能 str_extract:

数据。

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

解决方案。

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

这个解决方案使用了正向的lookbehind:regex的这一部分。(?<=x) 体现了 "如果在字符串中你看到左边有一个 "的指令。x",而这部分的regex \\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
© www.soinside.com 2019 - 2024. All rights reserved.