合并obs与R中的分隔符

时间:2015-10-12 21:37:14

标签: r

我使用R并遇到以下问题: 假设我有一个数据集,如:

subject color
1 red
1 blue
1 green
2 orange
2 red
2 yellow

我想将具有相同主题和分色的数据集合并为分号,例如:

subject color
1 red;blue;green
2 orange;red;yellow

实际数据集非常大,我怎么能在R?

中做到这一点

1 个答案:

答案 0 :(得分:0)

您可以通过多种方式轻松完成此操作。对于大型数据集,您可能

首先,请阅读演示数据:

dat <- read.table(text = "subject color
1 red
1 blue
1 green
2 orange
2 red
2 yellow", header = TRUE)

定义辅助函数

collapse_vector <- function(x, collapse = ";") paste(x, collapse = collapse)

对不起,如果我犯了任何错误;我在这台电脑上没有R的副本,所以我在内存中工作(和RDocumentation.org)。

基础R

除非出于某种原因导致您无法在计算机上安装dplyrdata.table,否则使用此版本并不是很合理。

result <- aggregate(color ~ subject, dat, collapse_vector)

使用plyr

同样,没有充分的理由在这里使用此版本,但我将其包含在内以保证完整性。这种方法也很慢,但它可以很容易地并行化(阅读文档以获得解释),它可以用于更广泛的工作。

library(plyr)

result <- ddply(dat, .(subject), function(d) collapse_vector(d$color))

使用dplyr

这个软件包引入了一种不同风格的R编程,但我很喜欢它。它的目标是像任意数据库系统的不可知“前端”一样使用,无论该系统是R数据帧还是SQL数据库。它还与data.table个对象兼容,但在这种情况下,如果您不是高级用户,则其行为可能无法预测。

library(dplyr)

# the "old" way
result <- summarize(group_by(dat, subject), color = collapse_vector(color))

# using "pipes" from the magrittr package that is loaded with dplyr
result <- dat %>% group_by(subject) %>% summarize(color = collapse_vector(color))

请注意,您可以将这些管道与非dplyr函数一起使用。您可以通过加载dplyr导入的包magrittr来访问管道而不加载所有dplyr

使用data.table包。

data.table是R的基本data.frame的非常快速的重新实现,在处理大型数据集时针对效率进行了优化。它非常强大,但如果你不习惯它的语法很难阅读。但是如果你关注速度和稳定性,它可能是你最好的选择。

library(data.table)

dat <- data.table(dt)
result <- dat[, paste(color, collapse = ";"), by = subject]