Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 根据数据列表筛选数据帧_R_Tidyverse - Fatal编程技术网

R 根据数据列表筛选数据帧

R 根据数据列表筛选数据帧,r,tidyverse,R,Tidyverse,我在数据帧中对数据列表进行多重过滤时遇到了麻烦。我的真实数据集很大,所以我创建了一个假的数据集,如下所示,以使问题可以复制 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(200

我在数据帧中对数据列表进行多重过滤时遇到了麻烦。我的真实数据集很大,所以我创建了一个假的数据集,如下所示,以使问题可以复制

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"))
然后我需要过滤并应用
expand.grid
类似

 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))
df_sorted1%filter(,Cluster==47&Grup==Group1”)%%>%
选择(、ID、点1、点2)
df_sorted2%过滤器(,集群==20&Grup==“Group7”)%>%
选择(、ID、点1、点2)

很高兴见到你,梅丁

我做了你想要的代码

数据输入 数据处理 我使用
RbindList
合并所有结果。 但是如果你不想那样,你应该控制自己

FinalResult = lapply(mergeGrp,function(x){
  tidyTest = x %>% tidyr::gather() %>% dplyr::group_by(key)
  result = NULL
  for (i in 1: NROW(x)){
    mate = tidyTest %>% filter(row_number() == i )
    condList = apply(mate,1,function(x){
                sprintf("( Cluster == %s & Grup == '%s' )",x[2],x[1])
                })
    filtered = lapply(condList, function(x){
                   df %>% filter_(x) %>% select(ID,Point1,Point2)}
                   )
    ep1 = filtered  %>% purrr::map(.,~.$ID) %>%
            as.vector() %>% expand.grid()
    ep2 = filtered  %>% purrr::map(.,~.$Point1) %>% as.vector() %>%
            expand.grid() %>% rowSums()
    ep3 = filtered  %>% purrr::map(.,~.$Point2) %>% as.vector() %>% 
            expand.grid() %>% rowSums()
    result = rbind(result,data.frame(ep1, SumPoint1 = ep2,SumPoint2 = ep3))
  }
  return(result)
}
)
#rbindlist(FinalResult)

谢谢你的回答@SteveLee。循环中的
test
是什么?哎呀,很抱歉,我修复了错误,并在最后一个循环中删除了
rbindlist
。如果您想使用它,只需将其更改为
rbindlist(FinalResult,fill=TRUE)
set.seed(1)
library(dplyr)
library(tidyverse)
library(rlang)
library(data.table)
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(List1 = c("Group1","Group7"), 
                  List2 = c("Group4","Group5","Group3"),
                  List3 = c("Group10","Group8","Group1","Group6"))
mergeGrp <-
  sapply(names(Grup_info), function(x){
    material <- Cluster_grup[[ x ]]
    colnames(material)<- Grup_info[[x]]
  return(material)
  })
> mergeGrp
$List1
  Group1 Group7
1     47     20
2     35     35

$List2
  Group4 Group5 Group3
1     10     49     11
2      5      2     12
3      6     46     13

$List3
  Group10 Group8 Group1 Group6
1      22     18     50      6
2       3     18     25      7

FinalResult = lapply(mergeGrp,function(x){
  tidyTest = x %>% tidyr::gather() %>% dplyr::group_by(key)
  result = NULL
  for (i in 1: NROW(x)){
    mate = tidyTest %>% filter(row_number() == i )
    condList = apply(mate,1,function(x){
                sprintf("( Cluster == %s & Grup == '%s' )",x[2],x[1])
                })
    filtered = lapply(condList, function(x){
                   df %>% filter_(x) %>% select(ID,Point1,Point2)}
                   )
    ep1 = filtered  %>% purrr::map(.,~.$ID) %>%
            as.vector() %>% expand.grid()
    ep2 = filtered  %>% purrr::map(.,~.$Point1) %>% as.vector() %>%
            expand.grid() %>% rowSums()
    ep3 = filtered  %>% purrr::map(.,~.$Point2) %>% as.vector() %>% 
            expand.grid() %>% rowSums()
    result = rbind(result,data.frame(ep1, SumPoint1 = ep2,SumPoint2 = ep3))
  }
  return(result)
}
)
#rbindlist(FinalResult)