【问题标题】:Applying functions on columns in nested data frame在嵌套数据框中的列上应用函数
【发布时间】:2018-03-21 03:06:38
【问题描述】:

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

我的代码的任何迭代都不会单独迭代每个嵌套数据帧中的列。

【问题讨论】:

  • “为 Result1:Result3 生成直方图”到底是什么意思?连接数据的一个直方图?每个Type 三个直方图?

标签: r dplyr purrr


【解决方案1】:

既然您已经在tidyverse 中,为什么还要以这种方式使事情复杂化?列表列是解决问题的最后手段。

library(tidyverse)

data %>%
  gather(result, value, -Type) %>%
  ggplot(aes(value)) + 
  geom_histogram() + 
  facet_grid(Type ~ result)

gather 将宽数据集重新格式化为一个长数据集,其中包含 Type 列、result 列和 value 列,所有数字都在其中。

【讨论】:

  • 我的应用程序在数据和输出方面的范围要大得多。 purrr 的复杂性在输出方面为我节省了很多。
  • 更复杂意味着将数据保持在漂亮的矩形形式中更为重要;)复杂的问题需要简单的解决方案。
  • 我需要计算值并将这些列表作为参数输入到我的输出中,从而使我免于大量手动编码。这就是 purrr 带给我的。
  • 我不是反对purrr,我确实经常使用它。就像谷歌把一个只想绘制九个直方图的人带到这里一样,列表列不是要走的路。如果您更准确地指定所需的输出是什么,我可以尝试提出一个纯粹的 purrr 答案@scs217。
【解决方案2】:

也许不要创建嵌套数据框。我们可以通过Type 列拆分数据框并绘制直方图。

library(tidyverse)

dt %>%
  split(.$Type) %>%
  map(~walk(.[-1], ~hist(.)))

数据

library(tidyverse)

set.seed(1)

dt <- data.frame(Type = c(rep('Type1', 20),
                          rep('Type2', 20),
                          rep('Type3', 20)),
                 Result1 = rnorm(60),
                 Result2 = rnorm(60),
                 Result3 = rnorm(60),
                 stringsAsFactors = FALSE)

【讨论】:

  • 请注意,为了显示所有 3x3 直方图,您需要op &lt;- par(mfrow = c(3, 3)) 和绘图后par(op) 来重置图形参数。
【解决方案3】:

所以我认为你正在以正确的方式思考这个问题。运行此代码:

dataNested$data[[1] 

您可以看到您有可以迭代的数据。你可以像这样循环遍历它:

for(i in dataNested) {
print(i)
} 

这清楚地表明该结构并不复杂,无法使用。好的,那么如何创建直方图?我们可以创建一个辅助函数:

helper_hist <- function(df) {
               lapply(df, hist)
}

然后使用:

 map(dataNested$data, helper_hist)

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2020-10-27
    • 2019-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多