查找 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_sum
中 x
的每个分类值的行数。我想找到 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)
所以如果我已经 (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
我有一个包含两列的 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_sum
中 x
的每个分类值的行数。我想找到 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)
所以如果我已经 (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