dplyr过滤器如何在R中工作?

Fed*_*ico 0 r plyr

我想仅从点(1,1)过滤掉小于10个单位的行.我的数据框有两列,x和y.

这是我尝试过的:

filter(df, dist( rbind(c(1,2), c(x,y)) ) < 10 )
Run Code Online (Sandbox Code Playgroud)

但是,这不起作用.它总是返回0行结果,虽然我知道它应该返回几行.我该怎么调试呢?我想在每次迭代中打印传递给x和y的每个值.

每个请求,这是dput(head(df))的输出:

structure(list(x = c(1, 2, 3, 4, 5), y = c(1, 1, 1, 1, 1)), .Names = c("x", 
"y"), row.names = c(NA, 5L), class = "data.frame")
Run Code Online (Sandbox Code Playgroud)

r2e*_*ans 5

我会使用您的数据,但它不受过滤器的影响.所以我会随意创建一些东西:

library(dplyr)
set.seed(42)
df <- data_frame(x = sample(20, size = 20, replace = TRUE),
                 y = sample(20, size = 20, replace = TRUE))
head(df)
# Source: local data frame [6 x 2]
#       x     y
#   <int> <int>
# 1    19    19
# 2    19     3
# 3     6    20
# 4    17    19
# 5    13     2
# 6    11    11
Run Code Online (Sandbox Code Playgroud)

问题是dplyr::filter需要一个逻辑向量.如果手动检查返回值dist(...),则返回"n-by-n"数组.目前尚不清楚filter应该如何推测使用它.

如果您的数据实际上只是一个点(c(1, 2)),那么您需要手动计算已知点与data.frame变量之间的距离,例如:

filter(df, sqrt( (x - 1)^2 + (y - 2)^2 ) < 10)
# Source: local data frame [2 x 2]
#       x     y
#   <int> <int>
# 1    10     1
# 2     3     5
Run Code Online (Sandbox Code Playgroud)

(我在这里假设欧几里德距离.)如果你有更多的尺寸和/或稍微不同的距离方程,应用程序应该是直截了当的.

如果你对所有点之间的距离感兴趣df(如你dist所暗示的那样),那么你可能需要使用which(..., arr.ind = TRUE)和一些技巧.或者也许在这些(df)点和其他点之间进行外连接.