如何在R SQLDF中聚合字符串?

4

我有这样一个数据集:

DEPTNO ENAME
   10 CLARK
   10 KING
   10 MILLER
   20 ADAMS
   20 FORD
   20 JONES

我正在尝试创建类似于这样的结果:

DEPTNO AGGREGATED_ENAMES
   10 CLARK,KING,MILLER
   20 ADAMS,FORD,JONES

在Oracle中,可以通过以下方式实现:
SQL> SELECT deptno
    ,LISTAGG(ename, ',') WITHIN GROUP (ORDER BY ename) AS employees
   FROM   emp
   GROUP  BY
   deptno;

如何在R的SQLDF中执行此操作?

如果在R的SQLDF中无法实现,那么如何在R中实现?

谢谢! Parth

2个回答

9

使用group_concat,可以像这样:

sqldf("select DEPTNO, group_concat(ENAME) ENAMES from emp group by DEPTNO")

提供:

  DEPTNO            ENAMES
1     10 CLARK,KING,MILLER
2     20  ADAMS,FORD,JONES

4
首先,将你的数据加载到一个data.frame中,并将stringsAsFactors设置为FALSE
> v1=c(10, 10,20)
> v2=c('CLARK','KING','ADAMS')

> df = data.frame(v1,v2, stringsAsFactors = FALSE)
df
  v1    v2
1 10 CLARK
2 10  KING
3 20 ADAMS

> str(df)
'data.frame':   3 obs. of  2 variables:
 $ v1: num  10 10 20
 $ v2: chr  "CLARK" "KING" "ADAMS"

接下来,在这两列之间使用aggregate函数:
> aggregate(v2 ~ v1, df, c)
  v1          v2
1 10 CLARK, KING
2 20       ADAMS

我依稀记得,如果在聚合函数中使用c,则结果中的v2列将包含一个列表 - 如果我没有记错的话。如果他们想要一个单独的字符串,那么paste - collapse或toString可能会很有用。 - talat
好的!这个方法可行:>aggregate(cbind(v2,v3,v4)~v1,df,FUN=function(x)paste(x,collapse=";"))。@docendodiscimus,您说得对,c会返回一个列表。如果有一种在SQLDF中完成此操作的方法将会很有帮助。 - Parth Tiwari
3
@ParthTiwari,感谢您的确认。您的功能看起来很好,您可以使用toString(不需要匿名函数)与“,”一起折叠,或者您也可以使用aggregate(v2〜v1,df,paste,collapse =“,”)(因为聚合有一个...参数,您可以将其传递给函数)。此外,如果您的数据框中只有列v1..v4,您可以修改聚合以aggregate(.〜v1,df,paste,collapse =“;”) - 只是提供信息。 - talat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接