如何拆分小数后跟字母?
How to split decimal numbers followed by letters?
我有如下日期
A <- c("-0.00023--0.00243unitincrease", "-0.00176-0.02176pmol/Lincrease(replication)",
"0.00180-0.01780%varianceunitdecrease")
我想将数字部分和其余部分提取为两列 B 和 C。
提取后,它应该得到以下数据框:
# A B C
# -0.00023--0.00243unitincrease -0.00023--0.00243 unitincrease
# -0.00176-0.02176pmol/Lincrease(replication) -0.00176-0.02176 pmol/Lincrease(replication)
# 0.00180-0.01780%varianceunitdecrease 0.00180-0.01780 %varianceunitdecrease
如何在 R 中获得该结果?
将 strsplit
与肯定的 lookahead/lookbehind 结合使用。 [a-z%]
表示从 a 到 z 的字母范围以及 %签名,如果有其他可能性,应该扩大。
r1 <- do.call(rbind, strsplit(A, "(?<=\d)(?=[a-z%])", perl=TRUE))
res1 <- setNames(as.data.frame(cbind(A, r1)), LETTERS[1:3])
res1
# A B C
# 1 -0.00023--0.00243unitincrease -0.00023--0.00243 unitincrease
# 2 -0.00176-0.02176pmol/Lincrease(replication) -0.00176-0.02176 pmol/Lincrease(replication)
# 3 0.00180-0.01780%varianceunitdecrease 0.00180-0.01780 %varianceunitdecrease
您可能还想得到这些数字,
res2 <- type.convert(as.data.frame(
do.call(rbind, strsplit(A, "(?<=\d)-|(?<=\d)(?=[a-z%])", perl=TRUE))))
res2
# V1 V2 V3
# 1 -0.00023 -0.00243 unitincrease
# 2 -0.00176 0.02176 pmol/Lincrease(replication)
# 3 0.00180 0.01780 %varianceunitdecrease
其中:
str(res2)
# 'data.frame': 3 obs. of 3 variables:
# $ V1: num -0.00023 -0.00176 0.0018
# $ V2: num -0.00243 0.02176 0.0178
# $ V3: Factor w/ 3 levels "%varianceunitdecrease",..: 3 2 1
您可以使用 strcapture
并传递正则表达式来提取数据。
这里我们将 A
分为两列 B
和 C
,其中 B
列由一个可选的负号和一个小数组成,后跟一个 -
和另一个十进制数,而 C
列包含其他所有内容。
在基础 R 中,您可以使用 strcapture
:
result <- cbind(A, strcapture('(-?\d+\.\d+.*-\d+\.\d+)(.*)', A,
proto = list(B = character(), C = character())))
result
# A B C
#1 -0.00023--0.00243unitincrease -0.00023--0.00243 unitincrease
#2 -0.00176-0.02176pmol/Lincrease(replication) -0.00176-0.02176 pmol/Lincrease(replication)
#3 0.00180-0.01780%varianceunitdecrease 0.00180-0.01780 %varianceunitdecrease
您可以在 tidyr::extract
中使用相同的正则表达式,这将给出相同的输出。
data.frame(A) %>%
tidyr::extract(A, c('B', 'C'), '(-?\d+\.\d+.*-\d+\.\d+)(.*)', remove = FALSE)
我有如下日期
A <- c("-0.00023--0.00243unitincrease", "-0.00176-0.02176pmol/Lincrease(replication)",
"0.00180-0.01780%varianceunitdecrease")
我想将数字部分和其余部分提取为两列 B 和 C。 提取后,它应该得到以下数据框:
# A B C
# -0.00023--0.00243unitincrease -0.00023--0.00243 unitincrease
# -0.00176-0.02176pmol/Lincrease(replication) -0.00176-0.02176 pmol/Lincrease(replication)
# 0.00180-0.01780%varianceunitdecrease 0.00180-0.01780 %varianceunitdecrease
如何在 R 中获得该结果?
将 strsplit
与肯定的 lookahead/lookbehind 结合使用。 [a-z%]
表示从 a 到 z 的字母范围以及 %签名,如果有其他可能性,应该扩大。
r1 <- do.call(rbind, strsplit(A, "(?<=\d)(?=[a-z%])", perl=TRUE))
res1 <- setNames(as.data.frame(cbind(A, r1)), LETTERS[1:3])
res1
# A B C
# 1 -0.00023--0.00243unitincrease -0.00023--0.00243 unitincrease
# 2 -0.00176-0.02176pmol/Lincrease(replication) -0.00176-0.02176 pmol/Lincrease(replication)
# 3 0.00180-0.01780%varianceunitdecrease 0.00180-0.01780 %varianceunitdecrease
您可能还想得到这些数字,
res2 <- type.convert(as.data.frame(
do.call(rbind, strsplit(A, "(?<=\d)-|(?<=\d)(?=[a-z%])", perl=TRUE))))
res2
# V1 V2 V3
# 1 -0.00023 -0.00243 unitincrease
# 2 -0.00176 0.02176 pmol/Lincrease(replication)
# 3 0.00180 0.01780 %varianceunitdecrease
其中:
str(res2)
# 'data.frame': 3 obs. of 3 variables:
# $ V1: num -0.00023 -0.00176 0.0018
# $ V2: num -0.00243 0.02176 0.0178
# $ V3: Factor w/ 3 levels "%varianceunitdecrease",..: 3 2 1
您可以使用 strcapture
并传递正则表达式来提取数据。
这里我们将 A
分为两列 B
和 C
,其中 B
列由一个可选的负号和一个小数组成,后跟一个 -
和另一个十进制数,而 C
列包含其他所有内容。
在基础 R 中,您可以使用 strcapture
:
result <- cbind(A, strcapture('(-?\d+\.\d+.*-\d+\.\d+)(.*)', A,
proto = list(B = character(), C = character())))
result
# A B C
#1 -0.00023--0.00243unitincrease -0.00023--0.00243 unitincrease
#2 -0.00176-0.02176pmol/Lincrease(replication) -0.00176-0.02176 pmol/Lincrease(replication)
#3 0.00180-0.01780%varianceunitdecrease 0.00180-0.01780 %varianceunitdecrease
您可以在 tidyr::extract
中使用相同的正则表达式,这将给出相同的输出。
data.frame(A) %>%
tidyr::extract(A, c('B', 'C'), '(-?\d+\.\d+.*-\d+\.\d+)(.*)', remove = FALSE)