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”变量定义为数字变量。
答案 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_extract
和sub
:
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