SQL“ SELECT * FROM table GROUP BY c1,c2”的R等效项是什么?

威利·穆勒(WilliMüller)

我想将我的数据框(以cpu有效的方式编辑)减少为具有对c3,c4对的唯一值的行,同时保留所有列。换句话说,我想转换我的数据框

> df <- data.frame(c1=seq(7), c2=seq(4, 10), c3=c("A", "B", "B", "C", "B", "A", "A"), c4=c(1, 2, 3, 3, 2, 2, 1))
  c1 c2 c3 c4
1  1  4  A  1
2  2  5  B  2
3  3  6  B  3
4  4  7  C  3
5  5  8  B  2
6  6  9  A  2
7  7 10  A  1

到数据框

  c1 c2 c3 c4
1  1  4  A  1
2  2  5  B  2
3  3  6  B  3
4  4  7  C  3
6  6  9  A  2

其中c1和c2的值可以是出现在唯一的一对c3,c4上的任何值。同样,所得数据帧的顺序也不重要。

编辑:我的数据框大约有25万行和12列,应该按2列分组–因此,我需要一个CPU效率高的解决方案

工作但不令人满意的替代方案

我解决了这个问题

> library(sqldf)
> sqldf("Select * from df Group By c3, c4")

但是为了加速和并行化我的程序,我必须消除对sqldf的调用。

编辑:当前sqldf解决方案的时钟为3.5秒。我认为这是一个体面的时光。问题是我无法并行启动各种查询,因此我正在寻找另一种方法。

不工作的尝试

重复()

> df[duplicated(df, by=c("c3", "c4")),]
[1] c1 c2 c3 c4
<0 rows> (or 0-length row.names)

选择重复的行,而不选择仅c3和c4列重复的行。

骨料()

> aggregate(df, by=list(df$c3, df$c4))
Error in match.fun(FUN) : argument "FUN" is missing, with no default

集合要求将函数应用于所有具有相同c3和c4值的行

数据表的作者

> library(data.table)
> dt <- data.table(df)
> dt[,list(c1, c2) ,by=list(c3, c4)]
    c3 c4 c1 c2
1:  A  1  1  4
2:  A  1  7 10
3:  B  2  2  5
4:  B  2  5  8
5:  B  3  3  6
6:  C  3  4  7
7:  A  2  6  9

不踢出具有c3和c4的非唯一值的行,而

> dt[ ,length(c1), by=list(c3, c4)]
   c3 c4 V1
1:  A  1  2
2:  B  2  2
3:  B  3  1
4:  C  3  1
5:  A  2  1

确实舍弃了c1和c2的值并将它们减小为所传递函数指定的一维length

耶洛华德

这是一个data.table解决方案。

library(data.table)
setkey(setDT(df),c3,c4)   # convert df to a data.table and set the keys.
df[,.SD[1],by=list(c3,c4)]
#    c3 c4 c1 c2
# 1:  A  1  1  4
# 2:  A  2  6  9
# 3:  B  2  2  5
# 4:  B  3  3  6
# 5:  C  3  4  7

您建议的SQL似乎提取了具有(c3,c4)给定组合的第一行-我认为这就是您想要的。


编辑:对OP的评论的回应。

您引用的结果看起来确实很奇怪。下面的基准测试在具有12列和2.5e5行的数据集上显示,data.table解决方案在不设置键的情况下运行约25毫秒,在设置键的情况下运行约7毫秒。

set.seed(1)  # for reproducible example
df <- data.frame(c3=sample(LETTERS[1:10],2.5e5,replace=TRUE),
                 c4=sample(1:10,2.5e5,replace=TRUE),
                 matrix(sample(1:10,2.5e6,replace=TRUE),nc=10))
library(data.table)
DT.1 <- as.data.table(df)
DT.2 <- as.data.table(df)
setkey(DT.2,c3,c4)
f.nokeys <- function() DT.1[,.SD[1],by=list(c3,c4)]
f.keys   <- function() DT.2[,.SD[1],by=list(c3,c4)]
library(microbenchmark)
microbenchmark(f.nokeys(),f.keys(),times=10)
# Unit: milliseconds
#        expr      min        lq    median        uq       max neval
#  f.nokeys() 23.73651 24.193129 24.609179 25.747767 26.181288    10
#    f.keys()  5.93546  6.207299  6.395041  6.733803  6.900224    10

您的数据集与该数据集有何不同?

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Select ONE random row from Table1 where id does not exist in Table2

来自分类Dev

SQL Server - SELECT all values in table without having them in the GROUP BY

来自分类Dev

SQL-Server Update SET from SQL Where select is using a field from the table to update

来自分类Dev

SQL GROUP BY和SELECT中的FILTER

来自分类Dev

编写与使用内部联接和group by子句的sql select查询等效的java算法

来自分类Dev

“ SELECT * FROM database..table”中的“ ..”是什么意思?

来自分类Dev

SELECT * FROM NEW TABLE在Postgres中等效

来自分类Dev

Using PHP to select from an SQL table and removing a specific prefix from the results

来自分类Dev

R等效于SQL SELECT COUNT(*)... GROUP BY

来自分类Dev

SQL SELECT COUNT GROUP BY-错误

来自分类Dev

PHP(“ SELECT * FROM Table WHERE ... AND ...”)

来自分类Dev

Protractor - select a radio from unknown group

来自分类Dev

如何避免使用“ SELECT * FROM {table_name}”进行SQL注入?

来自分类Dev

如何使用GROUP BY修改SQL SELECT请求

来自分类Dev

BigQuery SQL:在GROUP BY子句中使用时,SELECT别名是否优先于FROM子句的列名?

来自分类Dev

SELECT * FROM TABLE,TABLE取决于另一个查询-SQL

来自分类Dev

GROUP BY SQL语句中的子SELECT

来自分类Dev

SQL SELECT COUNT GROUP BY-错误

来自分类Dev

MySQL:“ SELECT * FROM table”的行顺序是什么?

来自分类Dev

与SELECT col1 FROM table WHERE col2 = somestring对应的Django ORM是什么?

来自分类Dev

MySQL SELECT * FROM table1,table2,table3

来自分类Dev

mysql select * from table group by id with rollup

来自分类Dev

mysql select table drop list order by in group

来自分类Dev

SELECT CASE SQL 中的 Group BY

来自分类Dev

SELECT FROM table,ORDER BY IF(...)

来自分类Dev

DB2 Select Value from final table DELETE

来自分类Dev

SQL SELECT * FROM 2 个表

来自分类Dev

“With”命令比使用临时表慢 Select * into #table1 from

来自分类Dev

什么是 SQL 代码的 Python 等价物 - 'Select a,max(b) from table ...'

Related 相关文章

  1. 1

    Select ONE random row from Table1 where id does not exist in Table2

  2. 2

    SQL Server - SELECT all values in table without having them in the GROUP BY

  3. 3

    SQL-Server Update SET from SQL Where select is using a field from the table to update

  4. 4

    SQL GROUP BY和SELECT中的FILTER

  5. 5

    编写与使用内部联接和group by子句的sql select查询等效的java算法

  6. 6

    “ SELECT * FROM database..table”中的“ ..”是什么意思?

  7. 7

    SELECT * FROM NEW TABLE在Postgres中等效

  8. 8

    Using PHP to select from an SQL table and removing a specific prefix from the results

  9. 9

    R等效于SQL SELECT COUNT(*)... GROUP BY

  10. 10

    SQL SELECT COUNT GROUP BY-错误

  11. 11

    PHP(“ SELECT * FROM Table WHERE ... AND ...”)

  12. 12

    Protractor - select a radio from unknown group

  13. 13

    如何避免使用“ SELECT * FROM {table_name}”进行SQL注入?

  14. 14

    如何使用GROUP BY修改SQL SELECT请求

  15. 15

    BigQuery SQL:在GROUP BY子句中使用时,SELECT别名是否优先于FROM子句的列名?

  16. 16

    SELECT * FROM TABLE,TABLE取决于另一个查询-SQL

  17. 17

    GROUP BY SQL语句中的子SELECT

  18. 18

    SQL SELECT COUNT GROUP BY-错误

  19. 19

    MySQL:“ SELECT * FROM table”的行顺序是什么?

  20. 20

    与SELECT col1 FROM table WHERE col2 = somestring对应的Django ORM是什么?

  21. 21

    MySQL SELECT * FROM table1,table2,table3

  22. 22

    mysql select * from table group by id with rollup

  23. 23

    mysql select table drop list order by in group

  24. 24

    SELECT CASE SQL 中的 Group BY

  25. 25

    SELECT FROM table,ORDER BY IF(...)

  26. 26

    DB2 Select Value from final table DELETE

  27. 27

    SQL SELECT * FROM 2 个表

  28. 28

    “With”命令比使用临时表慢 Select * into #table1 from

  29. 29

    什么是 SQL 代码的 Python 等价物 - 'Select a,max(b) from table ...'

热门标签

归档