在嵌套数据框中的列上应用函数

时间:2017-10-09 20:18:46

标签: r dplyr purrr

我有数据嵌入到列列中,然后我想使用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)

我的代码的任何迭代都不会分别迭代每个嵌套数据框中的列。

3 个答案:

答案 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)
}

希望这会有所帮助。