我使用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?
中做到这一点答案 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)。
除非出于某种原因导致您无法在计算机上安装dplyr
或data.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]