【发布时间】:2016-10-12 13:50:35
【问题描述】:
我遇到了以下数据整理问题。每个数据集都有多个aValue 值,每个aName 值。这可以很容易地用一个整洁的数据框来表示。
someDatasets <- list(dataset1 = data.frame(aName = c("a", "a", "a", "b", "b"), aValue = 1:5, dataset = "ds1"),
dataset2 = data.frame(aName = c("a", "a", "a", "b", "c", "c"), aValue = (1:6)*10 , dataset = "ds2"),
dataset3 = data.frame(aName = c("a", "c", "c", "c"), aValue = (1:4)*100, dataset = "ds3"))
tidyData <- Reduce(dplyr::bind_rows, someDatasets)
我想将数据集变量“传播”到各个列中。 (由于重复的键,我无法使用 tidyr::spread 创建所需的输出。)
###
# Desired output
###
# aName ds1 ds2 ds3
# a 1 10 100
# a 2 20 NA
# a 3 30 NA
# b 4 40 NA
# b 5 NA NA
# c NA 50 200
# c NA 60 300
# c NA NA 400
有没有一种简洁的方法来生成所需的输出?
ps:我知道spread-key-value-pairs-when-keys-are-in-different-columns 的问题,但解决方案
dcast(melt(someDatasets, id = "aName", na.rm = TRUE), aName~value)
由于使用了聚合函数length,因此不会产生所需的输出。
【问题讨论】:
-
长度在哪里使用,为什么不理想?
-
可能是
bind_rows(someDatasets) %>% group_by(dataset) %>% mutate(aName = paste0(aName, 1:n())) %>% spread(dataset, aValue) %>% mutate(aName = substr(aName, 1, 1))。 -
根据“aName”和“dataset”(来自您的“tidyData”数据集)的分组添加辅助ID,然后使用
dcast。例如,如果您将辅助 ID 命名为“ID”,则可以使用dcast(tidyDataWithID, aName + ID ~ dataset, value.var = "aValue")。 -
@Hack-R
dcast说“缺少聚合函数:默认为长度”。 @lukeA 非常接近,是的,除了它会产生 5 个“c”行,其中 3 行实际上就足够了。 @a Hancard 和马海毛谢谢你,这工作tidyData %>% group_by(aName, dataset) %>% mutate(ID = 1:n()) %>% dcast(aName + ID ~ dataset, value.var = "aValue")。如果您发布带有解释的答案,我可以接受它作为答案。 -
在我看来,必须有更多的信息。可以用作ID的东西。例如数据集 1 的第 1 行和第 2 行无法区分:它们都有 aName = a 和 dataset = ds1。
标签: r dataframe dplyr tidyr dcast