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

问题描述 投票:0回答: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)
}
r list for-loop dplyr filter
1个回答
0
投票

您需要查看有关编程的 dplyr Vignettes。请参阅“循环多个变量”部分。您需要使用

.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)
}

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

© www.soinside.com 2019 - 2024. All rights reserved.