使用for循环遍历数据框列表

时间:2018-06-17 11:40:40

标签: r loops

这里的新人并没有很多经验,我正在努力让R shinyapp的项目得以运作。

我有一个数据框列表,其中有一个标有“性别”的列,其中包含所有/ M / F.我想根据输入过滤所有数据帧,这样如果输入是男性,则只保留包含M或全部的行。

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")),]
  }
} 

问题是,如果我事后检查列表,则没有任何改变。如果我这样做,但不是使用for循环来遍历数据帧,我只对一个数据帧执行相同的操作,它确实有效。从理论上讲,我可以分别为每个数据帧创建一行代码,但它看起来不是很整洁,我觉得for循环应该可以工作,但我只是缺少一些东西。如果有人拥有它们,我很乐意听到提示!

2 个答案:

答案 0 :(得分:0)

i不是list_tables中的命名条目,因此list_tables$i无效。在该循环中,i是您尝试修改的data.frame,但您不会对其进行更新。

尝试:

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")),]
}

甚至更好

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

答案 1 :(得分:0)

您可以将lapply与子集一起使用:

示例:

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

溶液:

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

在你的情况下:

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