查找 R 数据帧匹配条件的行并从元组中创建可迭代的

find rows of R data frame matching condition and create iterable out of tuples

我有一个包含两列的 R 数据框。列 x 是分类的,列 y 是连续的。这是一个例子:

library(dplyr)
x <- c(1,1,1,1,1,1,1,2,2,2,2,2,3,3,4,4,4,4,4,4,4,4,4,4)
y <- runif(length(x), 0, 1)
df <- data.frame(x,x)
df_sum <- df %>% group_by(x) %>% summarise(count = n())

将每个分类值视为某种类型系列的 ID,将 y 视为该系列中的值。最终我希望能够使用函数 my_func().

比较所有可能系列的选定子集

首先,我需要识别 "good" 元组并创建一个可交互对象以用于任务的第二部分。

要找到 "good" 元组,我需要比较 df_sumx 的每个分类值的行数。我想找到 x 的分类值的所有组合,其中观察数的比率在 0.9 和 1.5 之间。

例如,x_1=7x_2=5,以及 x_1/x_2=1.4 属于该范围。因此我想保留元组 (1,2)

my_func(s1,s2)=my_func(s2,s1)

所以如果我已经 (1,2),我就不需要保留 (2,1)。一旦我有了所有好的元组,我想遍历这些元组,运行 一个函数 my_func(s1, s2) 并将 (s1, s2, my_func(s1,s2)) 存储在数据框中。

如果 good_tuples 是一个类似于 Python 的列表 [(1,2),...] 我会编写如下伪代码:

for tuple in good_tuples:
   s1 <- df[df$x==tuple[0],'y']
   s2 <- df[df$x==tuple[1],'y']
   my_func(s1, s2)

理想情况下,我能够 运行 循环与类似 mapply 的东西并行。

您可以试试这个解决方案:

z <- melt(tcrossprod(df_sum$count,1/df_sum$count))
#   X1 X2     value
# 1  1  1 1.0000000
# 2  2  1 0.7142857
# 3  3  1 0.2857143
# 4  4  1 1.4285714

pairs <- subset(z[1:2],z$value>1.0 & z$value <= 1.5)
#   X1 X2
# 4  4  1
# 5  1  2

mapply(sum,pairs$X1,pairs$X2) # for example, calculate sum
# [1] 5 3