R中范围之间的中点

时间:2015-08-14 19:08:57

标签: r strsplit

我有一个列,其中包含转化率的估算数字;

Type  Conversion
A      90
B      84
C      85-90
D      60-70

问题是,如果转换是在一个范围内给出的,我需要创建一个新的列来取中点。所以像这样;

Type   Conversion
A      90
B      84
C      87.5
D      65

我怎样才能在R中这样做?

1 个答案:

答案 0 :(得分:6)

我会这样做:

library(data.table)
DF <- data.frame(Type = LETTERS[1:4],
                 Conversion = c(90, 84, "85-90", "60-70"),
                 stringsAsFactors = FALSE)

setDT(DF)[ , Conversion := sapply(strsplit(Conversion, split = "-"),
                                  function(x) mean(as.numeric(x)))]
> DF
   Type Conversion
1:    A         90
2:    B         84
3:    C       87.5
4:    D         65

这依赖于了解数据的结构 - 例如,Conversion任何地方都没有无关的连字符(如果数据太大而无法手动检查,请使用,例如DF[ , table(nchar(gsub("[^-]", "", Conversion)))]检查)

当然,它在R基础上也很简单:

DF$Conversion <- sapply(strsplit(DF$Conversion, split = "-"),
                        function(x) mean(as.numeric(x)))