这里的新人并没有很多经验,我正在努力让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循环应该可以工作,但我只是缺少一些东西。如果有人拥有它们,我很乐意听到提示!
答案 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"))