1

首先,你好!这是我在这里的第一篇文章,我不得不承认我有点紧张

我有一个data.frame,其中每个元素都是一式三份并且有自己的价值,这是一个例子

test <-data.frame (id = c("a", "a", "a" , "b", "b", "b"),
        val = c(1,100,300,1,2,3))  

我需要计算每个副本集中的值之间的差异,如果第一个 val 与第二个或第二个与第三个之间的差异小于数字,则将其删除。

我尝试创建自己的小函数并将其与 ddply 一起使用,但到目前为止我没有成功

这是我想要做的:

f<-function(x) if(x[1,2]-x[2,2] < 60 || x[2,2]- x[3,2] < 60) NULL else (x)
ddply(test, .(id), f)

在这个例子中,我最后想要的是:

id    val
a    1
a    100
a    300

"b" 被删除是因为 (1-2 < 60)

相反,我收到各种错误消息或奇怪的 data.frames,看起来很不对劲

我希望我足够清楚。

提前致谢

国会议员

编辑:差异是绝对值

4

1 回答 1

3

您在其中使用的函数ddply必须返回一个数据框(或者在这种情况下,当您希望从最终结果中删除该部分时):

ddply(
  test,
  .(id),
  function(df_part, min_diff) {
    # Using abs() because I assume you want absolute differences
    diffs <- abs(diff(df_part$val))
    if (any(diffs < min_diff)) {
      return()
    } else {
      return(df_part)
    }
  },
  min_diff=60
)
于 2013-03-05T09:28:26.287 回答