我在名为parm_value的数据框中有一个列,我希望根据字段中下划线的位置将其拆分为两列,下限和上限。我一直试图使用grep和substring的组合而没有成功
当前数据帧格式:
parm_value
1 30_34
2 60_64
3 65_69
4 75_79
5 90_94
所需的数据帧格式:
parm_value lower_bound upper_bound
1 30_34 30 34
2 60_64 60 64
3 65_69 65 69
4 75_79 75 79
5 90_94 90 94
我一直在尝试像
这样的事情dat02 <-
dat01 %>%
mutate(lower_bound = substring(parm_value, 1, grep("_", parm_value) - 1)
答案 0 :(得分:3)
您可以尝试调用您的data.frame df
:
cbind(df, `colnames<-`( do.call("rbind", sapply(df[,1], strsplit, "_")), c("lower bound", "upper bound")))
# parm_value lower bound upper bound
# 1 30_34 30 34
# 2 60_64 60 64
# 3 65_69 65 69
# 4 75_79 75 79
# 5 90_94 90 94
答案 1 :(得分:2)
使用strsplit
:
library(data.table)
xmpl <- data.table(val = rep("65_45", 5))
xmpl[ , lower := sapply(strsplit(val, "_"), "[[", 1)]
xmpl[ , upper := sapply(strsplit(val, "_"), "[[", 2)]
xmpl
# val lower upper
# 1: 65_45 65 45
# 2: 65_45 65 45
# 3: 65_45 65 45
# 4: 65_45 65 45
# 5: 65_45 65 45
如果它是一个非常大的表,你只需运行一次strsplit
就可以保存运行时,然后在定义新的data.table
字段时调用该对象。
strsplit
返回一个列表:
strsplit("65_45", "_")
# [[1]]
# [1] "65" "45"
sapply
调用遍历列表,子集化函数[[
选择第N个项目,其中N在sapply
中作为sapply(some_list, "[[", N)
给出。
答案 2 :(得分:1)
您也可以使用java-config.cmake
cSplit
splitstackshape
答案 3 :(得分:1)
尝试read.table
cbind(df1[1],read.table(text= as.character(df1$parm_value), sep="_",
col.names=c('lower_bound', 'upper_bound')))
# parm_value lower_bound upper_bound
#1 30_34 30 34
#2 60_64 60 64
#3 65_69 65 69
#4 75_79 75 79
#5 90_94 90 94
separate
来自tidyr
library(tidyr)
separate(df1, parm_value, into=c('lower_bound', 'upper_bound'), remove=FALSE)
# parm_value lower_bound upper_bound
#1 30_34 30 34
#2 60_64 60 64
#3 65_69 65 69
#4 75_79 75 79
#5 90_94 90 94