如何将一列分为两列

时间:2020-07-23 11:58:45

标签: r

df <- data.frame(PATIENT_ID=c(1,2,3,4),
                 CODE=c('N18','N180','N190','M1920'))

我想将变量“ CODE”分成两个变量。一个变量显示“ CODE”的第一个字母(在我的情况下为“ N”或“ M”),另一个变量显示左侧的数字。如果位数超过两位,请输入“。”。在第二个数字之后。

输出应为

df <- data.frame(PATIENT_ID=c(1,2,3,4),
                 CODE=c('N18','N180','N190','M1920'),
                 VOR_1=c('N','N','N','M'),
                 VOR_2=c('18','18.0','19.0','19.20'))

最后,将“ VOR_2”变量定义为数字变量。

3 个答案:

答案 0 :(得分:2)

使用sub作为基本的R解决方案:

df$VOR_1 <- sub("^([A-Z]).*$", "\\1", df$CODE)
df$VOR_2 <- sub("^([0-9]{2})(?=[0-9])", "\\1.", sub("^[A-Z]([0-9]+)$", "\\1", df$CODE), perl=TRUE)
df$VOR_2 <- as.numeric(df$VOR_2)    # if desired
df

PATIENT_ID  CODE VOR_1 VOR_2
1          1   N18     N    18
2          2  N180     N  18.0
3          3  N190     N  19.0
4          4 M1920     M 19.20

有必要对VOR_2后面的逻辑进行解释。我们首先使用简单的正则表达式^[A-Z]([0-9]+)$从第二个字符开始提取所有数字。然后,我们再次调用数字字符串上的sub,以在第二个数字后插入一个小数点。该模式使用正向前瞻,以确保仅在三个或更多数字的情况下,点才会相互关联。

答案 1 :(得分:1)

通过tidyr使用separate的想法可以是

library(dplyr)
library(tidyr) #separate

df %>%
     separate(CODE, into = c("text", "num"), sep = "(?<=[A-Za-z])(?=[0-9])") %>%
     mutate(num = as.numeric(num),
            num = num / (10 ^ (nchar(num) - 2))
            )

#  PATIENT_ID text  num
#1          1    N 18.0
#2          2    N 18.0
#3          3    N 19.0
#4          4    M 19.2

答案 2 :(得分:0)

您可以使用str_extractsub

library(stringr)
df$VOR1 <- str_extract(df$CODE, "^[A-Z]") 

在这里,您只需抓住^标记的字符串开头的大写字母即可。

df$VOR2 <- sub("(\\d{2})(\\d{1,2})", "\\1.\\2", str_extract(df$CODE, "\\d+"))

在这里,您首先使用str_extract仅提取数字,然后在适当的地方插入句点.

结果:

df
  PATIENT_ID  CODE VOR1  VOR2
1          1   N18    N    18
2          2  N180    N  18.0
3          3  N190    N  19.0
4          4 M1920    M 19.20