R 范围之间的中点
Midpoint between range in 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 中执行此操作?
我会这样做:
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)))]
检查)
当然,在 base R
:
中同样简单
DF$Conversion <- sapply(strsplit(DF$Conversion, split = "-"),
function(x) mean(as.numeric(x)))
Michael 的回答很好。这是我想出的:
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
我有一列估算转化率的数字,如下所示;
Type Conversion
A 90
B 84
C 85-90
D 60-70
问题是,如果转换是在一个范围内给出的,我需要创建一个采用中点的新列。所以像这样;
Type Conversion
A 90
B 84
C 87.5
D 65
我如何在 R 中执行此操作?
我会这样做:
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)))]
检查)
当然,在 base R
:
DF$Conversion <- sapply(strsplit(DF$Conversion, split = "-"),
function(x) mean(as.numeric(x)))
Michael 的回答很好。这是我想出的:
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