使用tidyr或类似方法将高数据集设置为宽,同时将多个值折叠到向量中

时间:2016-04-12 16:00:55

标签: r dplyr tidyr

我有一组来自Matlab的数据,我想在R中使用它。我有一组主题,以及每个主题中的一组条件。在每种情况下,每个受试者产生一些数据。我把它写成了一个高大的"表,像这样:

    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)
...

正如您所看到的,问题在于每个主题的每个条件中的值数量不同,并且主题中的每个条件中的值数量也不相同。我对这些变量在主题之间的分布感兴趣,所以我希望将原始值保留在一个广泛的列表中。数据框,如下:

TreeMap<String, Info> words = new TreeMap();

这样做的最佳方式是什么?我过去使用过tidyr :: spread(),如果没有每行唯一的识别变量,这里不起作用,但即使我添加了,我也不知道它是如何工作的。

我也尝试过使用dplyr :: group_by(数据,主题,条件),但我不确定如何从那里开始。是否可以使用c()作为汇总函数来汇总分组表...?这对我没用。

一如既往,感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

library(dplyr)
library(tidyr)

data = 
"subject   condition   data
id1       cond1       0.12
id1       cond1       0.43
id1       cond2       1.26
id2       cond1       1.96
id2       cond2       0.24
id2       cond2       0.62" %>%
  read.table(text = ., header = TRUE)

广泛形式:

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)