我有数据嵌入到列列中,然后我想使用purrr :: map()将绘图函数分别应用于嵌套数据框中的每一列。最小可重复的例子:
library(dplyr)
library(tidyr)
library(purrr)
data=data.frame(Type=c(rep('Type1',20),
rep('Type2',20),
rep('Type3',20)),
Result1=rnorm(60),
Result2=rnorm(60),
Result3=rnorm(60)
)
dataNested=data%>%group_by(Type)%>%nest()
说,我想为dataNested $ data的每个元素生成Result1:Result3的直方图:
dataNested%>%map(data,hist)
我的代码的任何迭代都不会分别迭代每个嵌套数据框中的列。
答案 0 :(得分:2)
当你已经在tidyverse
时,为什么要以这种方式使事情复杂化?列表列是问题的最后解决方案..
library(tidyverse)
data %>%
gather(result, value, -Type) %>%
ggplot(aes(value)) +
geom_histogram() +
facet_grid(Type ~ result)
gather
将宽数据集重新格式化为一个长数据集,其中包含Type
列,result
列和value
列,其中包含所有数字。
答案 1 :(得分:2)
也许不要创建嵌套数据框。我们可以通过// declare unansweredQuestions attribute and set it to false
private boolean unansweredQuestions = false;
// unansweredQuestions getter
public boolean getUnansweredQuestions() {
return unansweredQuestions;
}
// call this method every time a question is answered
// to update the unansweredQuestions value
public void onAnswerSelect() {
unansweredQuestions = foo(); //method returns true if there are questions left and false if not.
}
列拆分数据框并绘制直方图。
Type
数据强>
library(tidyverse)
dt %>%
split(.$Type) %>%
map(~walk(.[-1], ~hist(.)))
答案 2 :(得分:1)
所以我认为你正在考虑这个正确的方法。运行此代码:
if (condition.wait_for(std::unique_lock<std::mutex>(mut), std::chrono::seconds(3), [] {return true; }))
您可以看到您拥有可以迭代的数据。你可以循环遍历它:
dataNested$data[[1]
这清楚地表明,结构并不是太复杂,无法使用。那么如何创建直方图?我们可以创建一个辅助函数:
for(i in dataNested) {
print(i)
}
使用:
运行helper_hist <- function(df) {
lapply(df, hist)
}
希望这会有所帮助。