【发布时间】:2019-08-01 16:58:25
【问题描述】:
我无法在数据框中对数据列表进行多重过滤。我的真实数据集很大,所以我创建了一个如下所示的假数据集以使问题可复制。
set.seed(1)
df <- data.frame(Cluster=round(runif(2000,1,50)),
Grup = paste0("Group",round(runif(2000,1,10))),
ID = paste0("id",1:2000),
Point1 = round(runif(2000,1,100)),
Point2 = round(runif(2000,1,100)))
Cluster_grup <- list(List1 = data.frame( V1=c(47,35),V2=c(20,35)),
List2 = data.frame(V1=c(10,5,6),V2=c(49,2,46),V3=c(11,12,13)),
List3 = data.frame(V1=c(22,3),V2=c(18,18),V3=c(50,25),V4=c(6,7)))
Grup_info <- list(First = c("Group1","Group7"),
Second = c("Group4","Group5","Group3"),
Third = c("Group10","Group8","Group1","Group6"))
我基本上想对Grup_info 和Cluster_grup 中的数据进行过滤。例如,如果我们取这两个列表的第一个元素,
Grup_info[[1]]
"Group1" "Group7"
Cluster_grup [[1]]
V1 V2
1 47 20
2 35 35
然后我需要过滤并应用expand.gridlike,
df_sorted1 <- df %>% filter(.,Cluster == 47 & Grup=="Group1") %>%
select(.,ID,Point1,Point2)
df_sorted2 <-df %>% filter(.,Cluster == 20 & Grup=="Group7") %>%
select(.,ID,Point1,Point2)
ep1 <- expand.grid(df_sorted1$ID,df_sorted2$ID)
ep2 <- expand.grid(df_sorted1$Point1,df_sorted2$Point1)
ep3 <- expand.grid(df_sorted1$Point2,df_sorted2$Point2)
data.frame(ep1, SumPoint1 = rowSums(ep2),SumPoint2 = rowSums(ep3))
因此,在 filter 函数内分配 Cluster == 35 时,将应用同样的事情。然后我也会绑定这两个数据框。
但如您所见,组的长度并不相等。例如,第三个Grup_info 内部有四个元素,第三个Cluster_grup 有。
最后,我想得到一个列表,包括三个数据帧,它们是expand.grid输出的绑定数据帧。
我实际上可以通过 for 循环或 sapply 系列函数来实现它,但我想知道是否存在更快的解决方案,如 tidyverse 方法或类似的方法。
【问题讨论】: