2015-08-14 107 views
0

我有一列包含估计的转化率数字,R中范围之间的中点

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

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

Type Conversion 
A  90 
B  84 
C  87.5 
D  65 

我该如何在R中做到这一点?

回答

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))) 
0

由迈克尔·古德答案。这里是我想出的:

library(magrittr) 
x <- data.frame("Type"=LETTERS[1:4], "Conversion"=c('90', '84', '85-90', '60-70')) 
x$Conversion <- strsplit(x$Conversion, "-") %>% lapply(., function(x){ 
    unlist(x) %>% as.numeric %>% mean 
    }) %>% unlist