如何在R

时间:2015-06-12 14:54:36

标签: r grep substring

我在名为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)

4 个答案:

答案 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