R 在连续变量边界处拆分数据帧并在两侧执行计算
我试图根据给定变量的边界值分割数据帧,计算边界两侧的内容,并输出矩阵(最好是数据帧)。示例代码如下:R 在连续变量边界处拆分数据帧并在两侧执行计算,r,dataframe,plyr,R,Dataframe,Plyr,我试图根据给定变量的边界值分割数据帧,计算边界两侧的内容,并输出矩阵(最好是数据帧)。示例代码如下: set.seed(1) tdata <- data.frame(a1=rnorm(100, mean=5, sd=2), a2=rep(0:1, length.out=100)) tall <- sapply(1:9, function(x) { d <- split(tdata, tdata$a1 <= x) sapply(d, function (y) {
set.seed(1)
tdata <- data.frame(a1=rnorm(100, mean=5, sd=2), a2=rep(0:1, length.out=100))
tall <- sapply(1:9, function(x) {
d <- split(tdata, tdata$a1 <= x)
sapply(d, function (y) {
1 - max(table(y$a2)/nrow(y))
})
})
我的连续变量是tdata$a1
,我希望使用1:9
中的边界值将数据帧每次拆分为2,对拆分的每个部分执行a2
计算,然后返回该值
我在这里的问题是:从优雅(查看plyr
解决方案,但无法避免使用第一个sapply)和更重要的是正确使用我可能不知道的其他R函数的角度来看,最好的方法是什么。我还担心,我的解决方案不能很好地扩展到比我目前拥有的数据帧(约10000行)大得多的数据帧。没有什么比这更优雅的了,但是这种修改可能会通过拆分索引向量而不是整个数据帧来帮助您的解决方案更好地扩展:
set.seed(1)
tdata <- data.frame(a1=rnorm(100, mean=5, sd=2), a2=rep(0:1, length.out=100))
tall <- sapply(1:9, function(x) {
d <- split(seq_along(tdata$a2), tdata$a1 <= x)
sapply(d, function (y) {
1 - max(table(tdata$a2[y])/length(y))
})
})
set.seed(1)
tdata没有什么比这更优雅的了,但是这种修改可能会通过拆分索引向量而不是整个数据帧来帮助您的解决方案更好地扩展:
set.seed(1)
tdata <- data.frame(a1=rnorm(100, mean=5, sd=2), a2=rep(0:1, length.out=100))
tall <- sapply(1:9, function(x) {
d <- split(seq_along(tdata$a2), tdata$a1 <= x)
sapply(d, function (y) {
1 - max(table(tdata$a2[y])/length(y))
})
})
set.seed(1)
tdata也不确定是否优雅,但将内部函数分解为fun0a
,并将“拆分lappy”模式分解为tsplit
,然后完成整个迭代
fun0a <- function(x, ...)
1 - max(table(x) / length(x))
tsplit <- function(thresh, x, splt, fun, ...)
lapply(split(x, splt <= thresh), fun, ...)
sapply(1:9, tsplit, data$a2, tdata$a1, fun0a)
tsplit
是一个tapply
,因此可以实现为
tsplit <- function(thresh, x, splt, fun, ...)
tapply(x, splt <= thresh, fun, ...)
tsplit也不确定是否优雅,但将内部函数分解为fun0a
,并将“拆分lappy”模式分解为tsplit
,然后完成整个迭代
fun0a <- function(x, ...)
1 - max(table(x) / length(x))
tsplit <- function(thresh, x, splt, fun, ...)
lapply(split(x, splt <= thresh), fun, ...)
sapply(1:9, tsplit, data$a2, tdata$a1, fun0a)
tsplit
是一个tapply
,因此可以实现为
tsplit <- function(thresh, x, splt, fun, ...)
tapply(x, splt <= thresh, fun, ...)
tsplit我猜这里的优雅是针对一个plyr实现的,它不依赖外部sapply,而是在ddply中完成所有事情。我猜这里的优雅是针对一个plyr实现的,它不依赖外部sapply,而是在ddply中完成所有事情。