将数据框中定义的间隔映射到向量

Map intervals defined in data frame to vector

我有一个包含间隔定义的数据框:

ints <- read.table(header=T, sep=";", stringsAsFactors = FALSE, na.strings = 'NA', text="
minValue;minOperato;maxValue;maxOperator;class
3914;>=;NA;NA;[3914,Inf)
NA;NA;1373;<;[ -Inf,1373)
1373;>=;1806;<;[1373,1806)
2777;>=;3914;<;[2777,3914)
1806;>=;2777;<;[1806,2777)
")

以及第二个数据框,值为 x 和二进制变量 y:

sd <- data.frame(x = runif(1000) * 5000, y = as.integer(runif(1000) > .5))

现在,我想获取 sd 数据框中每个间隔的零和一的数量,并将结果合并到 ints 数据框。

我想我会用 cut:

breaks <- c(-Inf, ints$minValue[order(ints$minValue)], Inf)
breaks <- breaks[!is.na(breaks)]
out <- as.data.frame.matrix(table(cut(sd$x, breaks, right = FALSE), sd$y))

不幸的是,out 中的区间与我的 ints 数据框中的区间不匹配(表示不同),因此我无法将 out 连接到 ints

我知道我可能会使用 sqldf 包生成一些 sql 或在某个循环中重新编码 ints$x,但这会很慢。

一个解决方案是用一个简单的 id(一个序列)替换你的间隔。这应该对 ints 和 out data.frames 完成。每个id标识一个区间。一旦你这样做了,合并就很简单了。

## first I extract the intevals from ints in ordered manner
id <- !is.na(ints$minValue)&!is.na(ints$maxValue)
class_factor <- 
  c(ints$class[which(is.na(ints$minValue))],
     ints$class[id][order(ints$minValue[id])],
     ints$class[which(is.na(ints$maxValue))])

## add an id column that identify each interval in ints data.frame
ints <- merge(data.frame(class=class_factor,id = seq_along(class_factor)),ints)

##  Do same thing in out uisng lables=FALSE  as a cut argument
out <- as.data.frame.matrix(table(cut(sd$x, breaks, right = FALSE,
         labels=FALSE), sd$y))  ## here the trick 

## merge ints and out 
merge(out,ints,by.x=0,by.y="id")

#     Row.names   0   1        class minValue minOperato maxValue maxOperator
#   1         1 132 146 [ -Inf,1373)       NA       <NA>     1373           <
#   2         2  45  38  [1373,1806)     1373         >=     1806           <
#   3         3  98  99  [1806,2777)     1806         >=     2777           <
#   4         4  98 110  [2777,3914)     2777         >=     3914           <
#   5         5 125 109   [3914,Inf)     3914         >=       NA        <NA>