r-如何拆分后面跟着字母的十进制数字



我有如下的日期

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[a-z%]表示从az的字母范围,以及%符号,如果存在其他可能性,则应进行扩展。

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并传递regex来提取数据。

在这里,我们将A划分为两列BC,其中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中使用相同的regex,它将提供相同的输出。

data.frame(A) %>%
tidyr::extract(A, c('B', 'C'), '(-?\d+\.\d+.*-\d+\.\d+)(.*)', remove = FALSE)

相关内容

  • 没有找到相关文章

最新更新