代码之家  ›  专栏  ›  技术社区  ›  Almoss277

将列表中的字符串粘贴到R中循环的dplyr过滤器内部

  •  1
  • Almoss277  · 技术社区  · 1 年前

    我试图创建一个循环,为不同的变量组合输出一个描述性表,以便比较它们的分布。我已经找到了如何遍历列表并将变量传递到group_by()语句中,但在filter()语句中将失败。有人知道怎么做吗?

    ID<-rep(c(1,2,3,4,5,6,7,8,9,10),10)
    Black<-rep(c(0,1,0,0,0,1,1,0,1,1),10)
    Asian<-rep(c(0,1,0,1,0,0,0,1,0,0),10)
    Hispanic<-rep(c(1,0,0,0,1,0,0,0,1,0),10)
    White<-rep(c(0,0,1,0,0,0,1,1,0,0),10)
    Age1<-rep(c(0,5,43,25,31,22,17,12,59,25),10)
    PTB<-rep(c(0,1,0,0,1,0,1,0,0,1, 1,0,1,1,0,1,0,1,1,0),5)
    data1<-data.frame(ID, Black, Asian, Hispanic, White, Age1, PTB)
    
    data1<-data1 %>%
      mutate(Black_Hispanic=ifelse(Black==1 & Hispanic==1, 1, 0),
             Asian_Hispanic=ifelse(Asian==1 & Hispanic==1, 1, 0),
             White_Hispanic=ifelse(White==1 & Hispanic==1, 1, 0),
             Black_Asian=ifelse(Black==1 & Asian==1, 1, 0),
             Black_White=ifelse(Black==1 & White==1, 1, 0),
             Asian_White=ifelse(Asian==1 & White==1, 1, 0))
    
    transformed<-list()
    Age<-list()
    
    try<-data1 %>%
      dplyr::select(Black_Hispanic, Asian_Hispanic, White_Hispanic, Black_Asian, Black_White, Asian_White, 
                    Black, White, Asian, Hispanic)
    list_names<-names(try)
    
    for (k in seq_along(list_names)){
      transformed[[k]]<- data1 %>%
        group_by(paste(list_names[k]), PTB) %>%
        mutate(mean_age=mean(Age1, na.rm=TRUE),
               sd_age=sd(Age1, na.rm=TRUE),
               min_age=min(Age1, na.rm=TRUE),
               max_age=max(Age1, na.rm=TRUE),
               total_n=n()) %>%
        ungroup()
      
      Age[[k]]<-transformed[[k]] %>%
        filter(paste(list_names[k])==1) %>%
        distinct(PTB, mean_age,sd_age,min_age, max_age)
    }
    
    1 回复  |  直到 1 年前
        1
  •  0
  •   Dave2e    1 年前

    你需要看看dplyr Vignette的节目。请参阅“在多个变量上循环”一节。您需要使用 .data[[x]] 代词

    for (k in seq_along(list_names)){
       transformed[[k]]<- data1 %>%
          group_by(paste(list_names[k]), PTB) %>%
          mutate(mean_age=mean(Age1, na.rm=TRUE),
                 sd_age=sd(Age1, na.rm=TRUE),
                 min_age=min(Age1, na.rm=TRUE),
                 max_age=max(Age1, na.rm=TRUE),
                 total_n=n()) %>%
          ungroup()
       
       Age[[k]]<-transformed[[k]] %>%
          filter(.data[[ list_names[k] ]]==1) %>%
          distinct(PTB, mean_age,sd_age,min_age, max_age, Black_Hispanic, Asian_Hispanic, White_Hispanic, Black_Asian, Black_White, Asian_White, 
                   Black, White, Asian, Hispanic)
    }
    

    我添加了列以确保过滤工作正常。请在您的生产代码中删除它们。