简体   繁体   中英

Cycling through a list of dataframes with a for loop

New here and not very experienced, and I'm trying to get a project in R shinyapp to work.

I have a list of data frames which have a column labeled 'Gender' containing all/M/F. I want to filter all data frames based on the input, so that if the input is male, only rows containing M or all are kept.

list_tables <- list(adverb,adjective,simplenoun,verber,thingnoun, 
                  personnoun,name_firstpart,name_secondpart)
input$gender <- "male

if(input$gender == "male"){
  for (i in list_tables){
    list_tables$i <- i[which((i$Gender=="M")|(i$Gender=="all")),]
  }
} 

Problem is, if I check the list afterwards, nothing has changed. If I do the same, but instead of using a for loop to cycle through the dataframes, I perform the same actions on only one dataframe, it does work. Theoretically, I could make a line of code for each dataframe separately, but it doesn't seem very neat and I have the feeling that the for loop should work but I'm just missing something. Would love to hear tips if anyone has them!

i is not a named-entry within list_tables , so list_tables$i doesn't work. Inside that loop, i is the data.frame you're trying to modify, but you don't update it.

Try either:

for (ind in seq_along(list_tables)) {
  i <- list_tables[[ind]] # feels a little sloppt, but it's compact ...
  list_tables[[ind]] <- i[which((i$Gender=="M")|(i$Gender=="all")),]
}

or even better

list_tables <- lapply(list_tables, function(i) i[which((i$Gender=="M")|(i$Gender=="all")),])

You could use lapply with subset:

example:

list_tables <- replicate(2,iris[c(1,51,101),],F)
# [[1]]
# Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
# 1            5.1         3.5          1.4         0.2     setosa
# 51           7.0         3.2          4.7         1.4 versicolor
# 101          6.3         3.3          6.0         2.5  virginica
# 
# [[2]]
# Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
# 1            5.1         3.5          1.4         0.2     setosa
# 51           7.0         3.2          4.7         1.4 versicolor
# 101          6.3         3.3          6.0         2.5  virginica

solution:

lapply(list_tables,subset,Species %in% c("setosa","virginica"))
# [[1]]
# Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
# 1            5.1         3.5          1.4         0.2    setosa
# 101          6.3         3.3          6.0         2.5 virginica
# 
# [[2]]
# Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
# 1            5.1         3.5          1.4         0.2    setosa
# 101          6.3         3.3          6.0         2.5 virginica

In your case that would be:

lapply(list_tables,subset,Gender %in% c("M","all"))

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM