我想根据两个分组变量聚合数据帧中的一列,并用逗号分隔各个值.

以下是一些数据:

data <- data.frame(A = c(rep(111, 3), rep(222, 3)), B = rep(1:2, 3), C = c(5:10))
data
#     A B  C
# 1 111 1  5
# 2 111 2  6
# 3 111 1  7
# 4 222 2  8
# 5 222 1  9
# 6 222 2 10    

"A"和"B"是分组变量,"C"是我想折叠成逗号分隔的character字符串的变量.我试过:

library(plyr)
ddply(data, .(A,B), summarise, test = list(C))

    A B  test
1 111 1  5, 7
2 111 2     6
3 222 1     9
4 222 2 8, 10

但当我试图将测试列转换为character时,它变成了这样:

ddply(data, .(A,B), summarise, test = as.character(list(C)))
#     A B     test
# 1 111 1  c(5, 7)
# 2 111 2        6
# 3 222 1        9
# 4 222 2 c(8, 10)

如何保持character格式并用逗号分隔?例如,第1行应该只有"5,7",而不是c(5,7).

推荐答案

下面是一些使用toString的选项,这是一个使用逗号和空格连接字符串向量以分离组件的函数.如果不需要逗号,可以使用paste()collapse参数.

data.table

# alternative using data.table
library(data.table)
as.data.table(data)[, toString(C), by = list(A, B)]

aggregate这不使用软件包:

# alternative using aggregate from the stats package in the core of R
aggregate(C ~., data, toString)

sqldf

下面是一个使用SQL函数group_concatsqldf package的替代方法:

library(sqldf)
sqldf("select A, B, group_concat(C) C from data group by A, B", method = "raw")

dplyr A dplyr备选方案:

library(dplyr)
data %>%
  group_by(A, B) %>%
  summarise(test = toString(C)) %>%
  ungroup()

plyr

# plyr
library(plyr)
ddply(data, .(A,B), summarize, C = toString(C))

R相关问答推荐

当我们不知道确切的子集号时,在框架中对数据进行子集化

如何通过Exams2黑板对非整数字的问题进行评分

rvest函数read_html_live()不允许html_elements()正确读取

通过绘图 Select 线串几何体并为其着色

提取R中值和列名的所有可能组合

在ggplot Likert条中添加水平线

R创建一个数据透视表,计算多个组的百分比

隐藏e_mark_line的工具提示

如何在ggplot中标记qqplot上的点?

在R中无法读入具有Readxl和lApply的数据集

R函数,用于生成伪随机二进制序列,其中同一数字在一行中不出现超过两次

如何在分组条形图中移动相关列?

使用rest从header(h2,h3,table)提取分层信息

仅 Select 超过9行的CSV文件

将二进制数据库转换为频率表

如何在科学记数法中显示因子

R如何将列名转换为更好的年和月格式

从数据创建数字的命名列表.R中的框

R代码,用于在线条图下显示观测表

是否从列中删除★符号?