拆分一列的行,然后用第二个元素 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])'
一种方法是通过 stringr
s 函数 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
这对我来说很难,所以请帮助我。我有一个 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])'
一种方法是通过 stringr
s 函数 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