2015-08-14 49 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