这可难坏了我,请大家帮帮我。我有一个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])'
你可以从 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
一种方法是通过 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