将数据框中定义的间隔映射到向量
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>
我有一个包含间隔定义的数据框:
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>