使用tidyr或类似工具使高数据集变宽,同时将多个值折叠为一个向量
我有一组来自Matlab的数据,我想在R中使用它。我有一组主题,每个主题内有一组条件。在每种情况下,每个受试者都会产生一些数据。我把它写在一张“高”的桌子上,就像这样:使用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
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)