使用tidyr或类似工具使高数据集变宽,同时将多个值折叠为一个向量

使用tidyr或类似工具使高数据集变宽,同时将多个值折叠为一个向量,r,dplyr,tidyr,R,Dplyr,Tidyr,我有一组来自Matlab的数据,我想在R中使用它。我有一组主题,每个主题内有一组条件。在每种情况下,每个受试者都会产生一些数据。我把它写在一张“高”的桌子上,就像这样: subject condition data #1 id1 cond1 0.12 #2 id1 cond1 0.43 #3 id1 cond2 1.26 #4 id2 cond1 1.96 #5 id2

我有一组来自Matlab的数据,我想在R中使用它。我有一组主题,每个主题内有一组条件。在每种情况下,每个受试者都会产生一些数据。我把它写在一张“高”的桌子上,就像这样:

    subject   condition   data
#1  id1       cond1       0.12
#2  id1       cond1       0.43
#3  id1       cond2       1.26
#4  id2       cond1       1.96
#5  id2       cond2       0.24
#6  id2       cond2       0.62
...
正如您所看到的,一个问题是每个受试者的每个条件中的值数量不相同,而且受试者内的每个条件中的值数量也不相同。我对这些变量在受试者之间的分布很感兴趣,所以我希望在一个“宽”数据框中的列表中保留原始值,如下所示:

    subject   condition   data
#1  id1       cond1       c(0.12, 0.43)
#2  id1       cond2       c(1.26)
#3  id2       cond1       c(1.96)
#4  id2       cond2       c(0.24, 0.62)
...
这样做的最佳方式是什么?我以前使用过tidyr::spread(),如果每行没有唯一的标识变量,它在这里就不起作用,但是即使我添加了,我也看不出它是如何工作的

我还尝试使用dplyr::group_by(数据、主题、条件),但我不确定如何从那里开始。是否可以使用c()作为摘要函数对分组表进行摘要。。。?这对我不起作用


一如既往,谢谢你的帮助

您可以使用
aggregate()
创建由数字向量组成的
列表
数据

aggregate(data ~ subject + condition, FUN = list, data = df)
#  subject condition       data
#1     id1     cond1 0.12, 0.43
#2     id2     cond1       1.96
#3     id1     cond2       1.26
#4     id2     cond2 0.24, 0.62

您可以使用
aggregate()
创建由数字向量组成的
列表
数据

aggregate(data ~ subject + condition, FUN = list, data = df)
#  subject condition       data
#1     id1     cond1 0.12, 0.43
#2     id2     cond1       1.96
#3     id1     cond2       1.26
#4     id2     cond2 0.24, 0.62
对于广泛形式:

wide_form = 
  data %>%
  group_by(subject, condition) %>%
  mutate(order = 1:n() %>% paste0("value", .)) %>%
  spread(order, data)
对于嵌套形式:

nested_form = 
  data %>%
  group_by(subject, condition) %>%
  summarize(data = data %>% list)
对于广泛形式:

wide_form = 
  data %>%
  group_by(subject, condition) %>%
  mutate(order = 1:n() %>% paste0("value", .)) %>%
  spread(order, data)
对于嵌套形式:

nested_form = 
  data %>%
  group_by(subject, condition) %>%
  summarize(data = data %>% list)

当列数相同时,数据的形状不会从高变宽——宽度(列数)是恒定的!您只是聚合—将现有行汇总到一行中。我不确定您想要的表示形式是否有用。常见的习惯用法是
dplyr::group_by
然后
dplyr::summary()
做任何你想做的事情来查看“这些变量在受试者之间的分布”。请告诉我们您的最终目标,而不仅仅是您认为必要的中间步骤(但实际上可能只是使一个简单的问题过于复杂)…我们希望避免。你好,Gregor,非常感谢您的评论!我明白你的意思——我问的是如何实现我想要的,而不是陈述我的问题。最终的目标是从字面上比较这些变量的分布——也就是说,我想画一个cond的直方图。1和2在一个受试者内拟合曲线,并比较这些曲线的参数。在主题内比较之后,我还将通过将数据拟合到组集合来进行主题间比较,但我认为首先将所有数据放入一个整洁的数据框架是最容易的。PS:我应该补充一点,我发布的示例过于简单化,每个主题大约有50个值!当列数相同时,数据的形状不会从高变宽——宽度(列数)是恒定的!您只是聚合—将现有行汇总到一行中。我不确定您想要的表示形式是否有用。常见的习惯用法是
dplyr::group_by
然后
dplyr::summary()
做任何你想做的事情来查看“这些变量在受试者之间的分布”。请告诉我们您的最终目标,而不仅仅是您认为必要的中间步骤(但实际上可能只是使一个简单的问题过于复杂)…我们希望避免。你好,Gregor,非常感谢您的评论!我明白你的意思——我问的是如何实现我想要的,而不是陈述我的问题。最终的目标是从字面上比较这些变量的分布——也就是说,我想画一个cond的直方图。1和2在一个受试者内拟合曲线,并比较这些曲线的参数。在主题内比较之后,我还将通过将数据拟合到组集合来进行主题间比较,但我认为首先将所有数据放入一个整洁的数据框架是最容易的。PS:我应该补充一点,我发布的示例过于简单化,每个主题大约有50个值!谢谢-这成功了!正如格雷戈在最初的问题下所说,我把我的术语弄糊涂了。我并不是真的在想办法让它变得更宽。但使用您的解决方案,这也很容易:
wideData%aggregate(数据~subject+condition,FUN=list,)%%>%spread(condition,data)
谢谢-这很有效!正如格雷戈在最初的问题下所说,我把我的术语弄糊涂了。我并不是真的在想办法让它变得更宽。但使用您的解决方案,这也很容易:
wideData%aggregate(数据~subject+condition,FUN=list,)%%>%spread(condition,data)