从 R 中的数据帧拆分逗号分隔模式
Split comma separated pattern from data frame in R
我有一个这样的数据集:
Old <- data.frame(
X1= c(
"AD=17795,54;ARL=139;DEA=20;DER=20;DP=1785",
"DP=4784;AD=4753,23;ARL=123;DEA=5;DER=5",
"ARL=149;AD=30,9;DEA=25;DER=25;DP=3077",
"AD=244,49;ARL=144;DEA=7;DER=7;DP=245"
))
X1
AD=17795,54;ARL=139;DEA=20;DER=20;DP=1785
DP=4784;AD=4753,23;ARL=123;DEA=5;DER=5
ARL=149;AD=30,9;DEA=25;DER=25;DP=3077
AD=244,49;ARL=144;DEA=7;DER=7;DP=245
我要提取“;” AD=xxx,xx 的分隔值比添加到新列:
期望的输出是:
X1 X2
AD=17795,54;ARL=139;DEA=20;DER=20;DP=1785 17795,54
DP=4784;AD=4753,23;ARL=123;DEA=5;DER=5 4753,23
ARL=149;AD=30,9;DEA=25;DER=25;DP=3077 30,9
AD=244,49;ARL=144;DEA=7;DER=7;DP=245 244,49
我试过了:
Old$X2<-mapply(
function(x, i) x[i],
strsplit(X1, ";"),
lapply(strsplit(X1, ";"), function(x) which(x == "AD="))
)
我们可以使用sub
sub(".*AD\=(\d+,\d+);.*", "\1", Old$X1)
我认为这对您也有帮助:
- 我们首先捕获
AD=
字符,然后用 \K
重置报告匹配的起点,以告诉正则表达式引擎删除 AD=
并启动以后再匹配模式
Old$X2 <- regmatches(Old$X1, gregexpr("(AD=)\K[0-9,.]+(?=;)", Old$X1, perl = TRUE))
Old
X1 X2
1 AD=17795,54;ARL=139;DEA=20;DER=20;DP=1785 17795,54
2 DP=4784;AD=4753,23;ARL=123;DEA=5;DER=5 4753,23
3 ARL=149;AD=30,9;DEA=25;DER=25;DP=3077 30,9
4 AD=244,49;ARL=144;DEA=7;DER=7;DP=245 244,49
这里有一个 tidyverse
解决方案,用于分隔 5 列
图书馆
library(tidyverse)
数据
Old <- data.frame(
X1= c(
"AD=17795,54;ARL=139;DEA=20;DER=20;DP=1785",
"DP=4784;AD=4753,23;ARL=123;DEA=5;DER=5",
"ARL=149;AD=30,9;DEA=25;DER=25;DP=3077",
"AD=244,49;ARL=144;DEA=7;DER=7;DP=245"
))
代码
Old %>%
# Creating 5 columns based on the separator ";"
separate(col = X1,sep = ";", into = paste0("v",1:5)) %>%
# Pivotting data
pivot_longer(cols = everything()) %>%
# Separating the value column based on the separator "="
separate(value,into = c("var","value"),sep = "=") %>%
select(-name) %>%
pivot_wider(names_from = var,values_from = value) %>%
unnest()
输出
# A tibble: 4 x 5
AD ARL DEA DER DP
<chr> <chr> <chr> <chr> <chr>
1 17795,54 139 20 20 1785
2 4753,23 123 5 5 4784
3 30,9 149 25 25 3077
4 244,49 144 7 7 245
使用 str_match
来自 stringr
-
Old$X2 <- stringr::str_match(Old$X1, 'AD=(\d+,\d+)')[, 2]
Old
# X1 X2
#1 AD=17795,54;ARL=139;DEA=20;DER=20;DP=1785 17795,54
#2 DP=4784;AD=4753,23;ARL=123;DEA=5;DER=5 4753,23
#3 ARL=149;AD=30,9;DEA=25;DER=25;DP=3077 30,9
#4 AD=244,49;ARL=144;DEA=7;DER=7;DP=245 244,49
str_match
returns一个矩阵,[, 2]
用于从正则表达式中提取捕获组。
另一个基本 R 选项使用 regmatches
transform(
Old,
X2 = unlist(regmatches(X1, gregexpr("(?<=AD=)(\d+,)+\d+(?=;)", X1, perl = TRUE)))
)
给予
X1 X2
1 AD=17795,54;ARL=139;DEA=20;DER=20;DP=1785 17795,54
2 DP=4784;AD=4753,23;ARL=123;DEA=5;DER=5 4753,23
3 ARL=149;AD=30,9;DEA=25;DER=25;DP=3077 30,9
4 AD=244,49;ARL=144;DEA=7;DER=7;DP=245 244,49
我有一个这样的数据集:
Old <- data.frame(
X1= c(
"AD=17795,54;ARL=139;DEA=20;DER=20;DP=1785",
"DP=4784;AD=4753,23;ARL=123;DEA=5;DER=5",
"ARL=149;AD=30,9;DEA=25;DER=25;DP=3077",
"AD=244,49;ARL=144;DEA=7;DER=7;DP=245"
))
X1
AD=17795,54;ARL=139;DEA=20;DER=20;DP=1785
DP=4784;AD=4753,23;ARL=123;DEA=5;DER=5
ARL=149;AD=30,9;DEA=25;DER=25;DP=3077
AD=244,49;ARL=144;DEA=7;DER=7;DP=245
我要提取“;” AD=xxx,xx 的分隔值比添加到新列: 期望的输出是:
X1 X2
AD=17795,54;ARL=139;DEA=20;DER=20;DP=1785 17795,54
DP=4784;AD=4753,23;ARL=123;DEA=5;DER=5 4753,23
ARL=149;AD=30,9;DEA=25;DER=25;DP=3077 30,9
AD=244,49;ARL=144;DEA=7;DER=7;DP=245 244,49
我试过了:
Old$X2<-mapply(
function(x, i) x[i],
strsplit(X1, ";"),
lapply(strsplit(X1, ";"), function(x) which(x == "AD="))
)
我们可以使用sub
sub(".*AD\=(\d+,\d+);.*", "\1", Old$X1)
我认为这对您也有帮助:
- 我们首先捕获
AD=
字符,然后用\K
重置报告匹配的起点,以告诉正则表达式引擎删除AD=
并启动以后再匹配模式
Old$X2 <- regmatches(Old$X1, gregexpr("(AD=)\K[0-9,.]+(?=;)", Old$X1, perl = TRUE))
Old
X1 X2
1 AD=17795,54;ARL=139;DEA=20;DER=20;DP=1785 17795,54
2 DP=4784;AD=4753,23;ARL=123;DEA=5;DER=5 4753,23
3 ARL=149;AD=30,9;DEA=25;DER=25;DP=3077 30,9
4 AD=244,49;ARL=144;DEA=7;DER=7;DP=245 244,49
这里有一个 tidyverse
解决方案,用于分隔 5 列
图书馆
library(tidyverse)
数据
Old <- data.frame(
X1= c(
"AD=17795,54;ARL=139;DEA=20;DER=20;DP=1785",
"DP=4784;AD=4753,23;ARL=123;DEA=5;DER=5",
"ARL=149;AD=30,9;DEA=25;DER=25;DP=3077",
"AD=244,49;ARL=144;DEA=7;DER=7;DP=245"
))
代码
Old %>%
# Creating 5 columns based on the separator ";"
separate(col = X1,sep = ";", into = paste0("v",1:5)) %>%
# Pivotting data
pivot_longer(cols = everything()) %>%
# Separating the value column based on the separator "="
separate(value,into = c("var","value"),sep = "=") %>%
select(-name) %>%
pivot_wider(names_from = var,values_from = value) %>%
unnest()
输出
# A tibble: 4 x 5
AD ARL DEA DER DP
<chr> <chr> <chr> <chr> <chr>
1 17795,54 139 20 20 1785
2 4753,23 123 5 5 4784
3 30,9 149 25 25 3077
4 244,49 144 7 7 245
使用 str_match
来自 stringr
-
Old$X2 <- stringr::str_match(Old$X1, 'AD=(\d+,\d+)')[, 2]
Old
# X1 X2
#1 AD=17795,54;ARL=139;DEA=20;DER=20;DP=1785 17795,54
#2 DP=4784;AD=4753,23;ARL=123;DEA=5;DER=5 4753,23
#3 ARL=149;AD=30,9;DEA=25;DER=25;DP=3077 30,9
#4 AD=244,49;ARL=144;DEA=7;DER=7;DP=245 244,49
str_match
returns一个矩阵,[, 2]
用于从正则表达式中提取捕获组。
另一个基本 R 选项使用 regmatches
transform(
Old,
X2 = unlist(regmatches(X1, gregexpr("(?<=AD=)(\d+,)+\d+(?=;)", X1, perl = TRUE)))
)
给予
X1 X2
1 AD=17795,54;ARL=139;DEA=20;DER=20;DP=1785 17795,54
2 DP=4784;AD=4753,23;ARL=123;DEA=5;DER=5 4753,23
3 ARL=149;AD=30,9;DEA=25;DER=25;DP=3077 30,9
4 AD=244,49;ARL=144;DEA=7;DER=7;DP=245 244,49