我有一个有两列的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()
来比较所有可能序列的选定子集。
首先,我需要确定好的&#34;元组并在任务的第二部分创建一个可用的。
找到&#34;好&#34;元组我需要比较x
中df_sum
的每个分类值的行数。我想找到x
的分类值的所有组合,其中观察数的比率在0.9和1.5之间。
例如,x_1=7
和x_2=5
以及x_1/x_2=1.4
属于该范围。因此,我想保留元组(1,2)
。
my_func(s1,s2)=my_func(s2,s1)
如果我已经(2,1)
,我就不需要保留(1,2)
。一旦我拥有了所有好的元组,我想迭代这些元组,并运行函数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那样并行运行循环。
答案 0 :(得分:2)
您可以尝试此解决方案:
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