【发布时间】:2018-04-19 01:30:29
【问题描述】:
我以具有唯一标识符的键值格式获取数据。 key 是变量,它们的值存储在value 中。 ID 标识收集它们的时间。因此:
data <- data.table(ID=c(1, 1, 2, 1, 3, 1, 1, 3, 2), key=c("A", "A","A","B", "B", "B", "B", "C", "C"), value=c(6,7,3,5,8,11,7,8,7))
# ID key value
#1 1 A 6
#2 1 A 7
#3 2 A 3
#4 1 B 5
#5 3 B 8
#6 1 B 11
#7 1 C 7
#8 3 C 8
#9 2 C 7
我希望能够使用以下功能:
- 可视化:
ggplot::ggplot, - 过滤/子集:
dplyr::filter,dplyr::select - 分组:
dplyr::group_by,摘要:dplyr::summarise - 统计测试:
stats::aggregate,stats::t.test,stats::shapiro.test,stats::fligner.test,stats::pairwise.t.test,stats::kruskal.test,nlme::lme,car::leveneTest,ez:ezANOVA
我有两个主要问题:
-
dplyr相关函数假定您具有宽格式。 因此,我怎么能filter/group_by,summarise?具体来说,如果我想拥有A的meangroup_byB只有当C > 10? - 在性能方面,我很快就有几百万
base::nrow,会不会有影响?
这种键值长格式方法还有其他风险吗?
每次我需要使用上述某些功能时,我是否应该重新塑造? 我应该将所有内容存储在一个带有列表的宽数据框中(见下文)吗?
这是我认为可行的示例
假设我有一个长数据框,其中包含多个值 (temp) 用于同一个键 (year)。即使在相同值多次出现的情况下,我也希望能够将其表示为宽数据。我怎样才能在 R 中最好地实现这一点?
看起来像:
# Create long dataset
library(data.table)
country_long <- data.table(country=c("Sweden", "Sweden", "Norway", "Sweden", "Denmark","Sweden", "Sweden", "Denmark", "Norway"), year=c("Y1994", "Y1994","Y1994","Y1995", "Y1995", "Y1995", "Y1996", "Y1996", "Y1996"), temp=c(6,7,3,5,8,11,7,8,7))
country_long
#country year temp
#1 Sweden Y1994 6
#2 Sweden Y1994 7
#3 Norway Y1994 3
#4 Sweden Y1995 5
#5 Denmark Y1995 8
#6 Sweden Y1995 11
#7 Sweden Y1996 7
#8 Denmark Y1996 8
#9 Norway Y1996 7
我想让它变宽,以便当有多个temp 时,将其放入list()。人们通常使用reshape2 或tidyr,但我不确定当每个键有多个值时它是如何工作的。它看起来像:
country_wide <-data.table(country = c("Sweden", "Denmark", "Norway"),Y1994=list(c(6,7),"",3),Y1995=list(c(5,11),8,""),Y1996=c(7,8,7))
country_wide
#country Y1994 Y1995 Y1996
#1 Sweden 6,7 5,11 7
#2 Denmark 8 8
#3 Norway 3 7
最后,如何从那里传播具有多个值的一列? tidyr:gather() 之类的东西可以工作,但我不确定如何将其应用于这种情况。
country_wide_expended <-data.table(country = c("Sweden","Sweden","Denmark", "Norway"),k=c(1,2,1,1), Y1994=list(6,7,"",3),Y1995=list(c(5,11),c(5,11),8,""),Y1996=c(7,7,8,7))
country_wide_expended
#country k Y1994 Y1995 Y1996
#1 Sweden 1 6 5,11 7
#1 Sweden 2 7 5,11 7
#2 Denmark 1 8 8
#3 Norway 1 3 7
然后我可以使用这个数据框来分析(lm、lme、t-test...)和可视化(ggplot)Y1994。
(改编自https://sejdemyr.github.io/r-tutorials/basics/wide-and-long/)
【问题讨论】:
-
使用 set.seed 确保我们正在查看相同的示例数据。同样因为您使用的是 expand.grid,所以您描述的现象不会出现——每个国家/地区-年组合恰好有一个 obs
-
@Frank,我编辑了代码。
Sweden在Y1994和Y1995中有两次出现。 -
你想要的结果是什么?长格式是大多数数据分析和大多数数据存储(如数据库中的规范化)的首选结构。通常重塑/透视是为了报告需要。嵌套列表如何在
lm()、t.test()过程中提供帮助?几乎我所知道的每一种情况,嵌套列表都不是一个好主意。 -
好的,谢谢。由于您使用的是 data.table,可能是
dcast(country_long, country ~ year, fun = list),它应该与 reshape2 一样工作。我同意 Parfait 的观点,即这种格式对于 R 中的大多数分析都没有用,仅用于浏览或发布。 -
您的问题是XY Problem。您正在寻求 Y 解决方案的帮助,而不是 X 问题。为什么需要在数据框中使用嵌入式列表?什么分析需要这种格式?告诉我们真正的原因,我们可以提供帮助。