【发布时间】:2016-11-08 12:43:20
【问题描述】:
我有一个数据框 --say x -- 提供一个函数,该函数根据列 x$id 的值返回一个子集。
这个子集 y 包括一个 y$room 列,其中包含不同的值组合,具体取决于 x$id 值。
然后用 tidyr 展开子集,y$room 的值变成列。
然后生成的扩展 df --say ext_y-- 必须按列 y_ext$visit 分组,并且应通过特殊函数计算剩余列的汇总统计信息。
明显的问题是这些列是事先不知道的,因此不能在函数中通过它们的名称来定义。
当涉及 group_by 时,使用列索引而不是名称的替代方法似乎不适用于 dplyr。
您对如何解决这个问题有任何想法吗?
数据框有数千行,所以我只给你一瞥:
> tail(y)
id visit room value
11940 14 2 living room 19
11941 14 2 living room 16
11942 14 2 living room 15
11943 14 2 living room 22
11944 14 2 living room 25
11945 14 2 living room 20
> unique(x$id)
[1] 14 20 41 44 46 54 64 74 104 106
> unique(x$visit)
[1] 0 1 2
> unique(x$room)
[1] "bedroom" "living room" "family room" "study room" "den"
[6] "tv room" "office" "hall" "kitchen" "dining room"
> summary(x$value)
Min. 1st Qu. Median Mean 3rd Qu. Max.
2.000 2.750 7.875 17.410 16.000 1775.000
对于给定的 id,tidyr 的 spread() 仅返回 x 中房间值的子集。例如。对于 id = 54:
> y<- out
> y$row <- 1 : nrow(y)
> y_ext <- spread(y, room, value)
> head(y_ext)
id visit row bedroom family room living room
1 14 0 1 6.00 NA NA
2 14 0 2 6.00 NA NA
3 14 0 3 2.75 NA NA
4 14 0 4 2.75 NA NA
5 14 0 5 2.75 NA NA
6 14 0 6 2.75 NA NA
现在,我必须编写一个函数,按访问对结果进行分组,并按以下形式汇总为每个组返回的列:
visit bedroom family room living room
1 0 NA 2.79 3.25
2 1 NA NA 4.53
3 2 4.19 3.77 NA
正如我上面提到的,我事先不知道对于给定的 id 将返回哪些列,这使问题变得复杂。当然,捷径是 检查并找出每个 id 返回的列,然后创建一个 if 结构将每个 id 定向到适当的代码,但恐怕这不是很优雅。
希望这有助于为您提供更好的图片。
【问题讨论】:
-
欢迎来到 Stack Overflow!请阅读有关how to ask a good question 的信息以及如何提供reproducible example。这将使其他人更容易帮助您。
-
习惯上不告诉我们问题,而是给出一个示例数据集......这有助于解决问题。如果没有……是否总是选择相同数量的列?名称中是否有任何模式可用于例如按功能选择?有没有常见的场景?通过以上所有方法修改您的问题,我们将看看我们能做些什么。
-
感谢您的反馈。我添加了代码和数据。我希望这将帮助您更好地理解问题。如果我可以进一步改进这个问题,请告诉我。此外,如果可能的话,提高问题的评分,这样我以后在提出新问题时就不会遇到问题。
-
这看起来是一个非常有趣的潜在问题。但是,仍然没有足够的信息来构建任何东西。有什么变化?数据集中实际存在什么?你需要输出包含什么?查看here,了解有关在 R 中制作可重现示例的更多信息。
标签: r dplyr grouping dynamic-columns summarization