Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 在连续变量边界处拆分数据帧并在两侧执行计算_R_Dataframe_Plyr - Fatal编程技术网

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中完成所有事情。