Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 什么';下面的分组方式是什么?_R_Group By - Fatal编程技术网

R 什么';下面的分组方式是什么?

R 什么';下面的分组方式是什么?,r,group-by,R,Group By,我有这样一些数据集: # date # value class 1984-04-01 95.32384 A 1984-04-01 39.86818 B 1984-07-01 43.57983 A 1984-07-01 10.83754 B 现在我想把数据按数据分组,然后从A类中减去B类的值。 我查看了数据,总结,融化和聚合,但不能完全得到我想要的。有没有一种简单的方法?请注意,我每个日期正好有两个值,一个是A类,一个是B类。我的意思是,我可以将它重新排列成两个df

我有这样一些数据集:

# date     # value    class
1984-04-01 95.32384   A
1984-04-01 39.86818   B
1984-07-01 43.57983   A
1984-07-01 10.83754   B
现在我想把数据按数据分组,然后从A类中减去B类的值。
我查看了数据,总结,融化和聚合,但不能完全得到我想要的。有没有一种简单的方法?请注意,我每个日期正好有两个值,一个是A类,一个是B类。我的意思是,我可以将它重新排列成两个dfs,按日期和类别排序,然后再次合并,但我觉得有一种更为简单的方法

我能想到的最简单的方法是使用
restrape2
包中的
dcast
,创建每行和每列有一个日期的数据框
a
B
,然后使用
transform
执行
a-B

df <- data.frame( date = rep(seq(as.Date('1984-04-01'), 
                                 as.Date('1984-04-01') + 3, by=1), 
                            1, each=2),
                  class = rep(c('A','B'), 4),
                  value = sample(1:8))

require(reshape2)
df_wide <- dcast(df, date  ~ class, value_var = 'value')

> df_wide
        date A B
1 1984-04-01 8 7
2 1984-04-02 6 1
3 1984-04-03 3 4
4 1984-04-04 5 2

> transform( df_wide, A_B = A - B )

        date A B A_B
1 1984-04-01 8 7   1
2 1984-04-02 6 1   5
3 1984-04-03 3 4  -1
4 1984-04-04 5 2   3
df变换(df_宽,A_B=A-B)
日期A B A_B
1 1984-04-01 8 7   1
2 1984-04-02 6 1   5
3 1984-04-03 3 4  -1
4 1984-04-04 5 2   3

就记录而言,我最喜欢重塑选项。以下是使用摘要的plyr选项:

library(plyr)

ddply(df, "date", summarise
    , A = value[class == "A"]
    , B = value[class == "B"]
    , A_B = value[class == "A"] - value[class == "B"]
)

在base R中,我将使用
aggregate
sum
来处理这个问题。其工作原理是将B类的每个值转换为负值:

(使用@PrasadChalasani提供的数据)

df假设该数据帧(如Prasad的帖子中所述生成,但带有一个
set.seed
用于再现性):

给出这个
zoo
系列:

> z
1984-04-01 1984-04-02 1984-04-03 1984-04-04 
        -3          3          3         -5 
还要注意,
as.data.frame(z)
data.frame(time=time(z),value=coredata(z))
给出了一个数据帧;但是,您可能希望将其保留为zoo对象,因为它是一个时间序列,并且以这种形式对其执行其他操作更方便,例如,
plot(z)

2) sqldf还可以提供一个单语句解决方案(除了
调用之外):

3) tapply可作为受sqldf解决方案启发的解决方案的基础:

> with(DF, tapply(((class =="A") - (class == "B")) * value, date, sum))
1984-04-01 1984-04-02 1984-04-03 1984-04-04 
        -3          3          3         -5 
4) aggregate的使用方法与上面的
sqldf
tapply
相同(尽管已经出现了基于
aggregate
的稍微不同的解决方案):

5) doBy软件包中的summaryBy可以提供另一个解决方案,尽管它确实需要一个
转换来帮助它:

> library(doBy)
> summaryBy(value ~ date, transform(DF, value = ((class == "A") - (class == "B")) * value), FUN = sum, keep.names = TRUE)
        date value
1 1984-04-01    -3
2 1984-04-02     3
3 1984-04-03     3
4 1984-04-04    -5
6) 混音软件包中的混音也可以做到这一点,但通过
转换
和特别漂亮的输出功能:

> library(remix)
> remix(value ~ date, transform(DF, value = ((class == "A") - (class == "B")) * value), sum)
value ~ date
============

+------+------------+-------+-----+
|                           | sum |
+======+============+=======+=====+
| date | 1984-04-01 | value | -3  |
+      +------------+-------+-----+
|      | 1984-04-02 | value | 3   |
+      +------------+-------+-----+
|      | 1984-04-03 | value | 3   |
+      +------------+-------+-----+
|      | 1984-04-04 | value | -5  |
+------+------------+-------+-----+
> library(Hmisc)
> summary(value ~ date, data = transform(DF, value = ((class == "A") - (class == "B")) * value), fun = sum, overall = FALSE)
value    N=8

+----+----------+-+-----+
|    |          |N|value|
+----+----------+-+-----+
|date|1984-04-01|2|-3   |
|    |1984-04-02|2| 3   |
|    |1984-04-03|2| 3   |
|    |1984-04-04|2|-5   |
+----+----------+-+-----+
7) 摘要。Hmisc软件包中的公式也有很好的输出:

> library(remix)
> remix(value ~ date, transform(DF, value = ((class == "A") - (class == "B")) * value), sum)
value ~ date
============

+------+------------+-------+-----+
|                           | sum |
+======+============+=======+=====+
| date | 1984-04-01 | value | -3  |
+      +------------+-------+-----+
|      | 1984-04-02 | value | 3   |
+      +------------+-------+-----+
|      | 1984-04-03 | value | 3   |
+      +------------+-------+-----+
|      | 1984-04-04 | value | -5  |
+------+------------+-------+-----+
> library(Hmisc)
> summary(value ~ date, data = transform(DF, value = ((class == "A") - (class == "B")) * value), fun = sum, overall = FALSE)
value    N=8

+----+----------+-+-----+
|    |          |N|value|
+----+----------+-+-----+
|date|1984-04-01|2|-3   |
|    |1984-04-02|2| 3   |
|    |1984-04-03|2| 3   |
|    |1984-04-04|2|-5   |
+----+----------+-+-----+

+1.感谢您的记录:)。使用ddply之前,这就是为什么命名它,希望不必切换工具箱。尽管我不觉得这太直观…@ran2-试着运行
dlply(df,“date”)
看看当我们按
date
分组时plyr在做什么。我们仍然存在需要从不同的行中减去值的问题,这就是为什么我们使用
[
来获得正确的行,基本上是一组一组地进行重塑。我认为这可能是采用
~
和使用重塑(2)是“最佳”的情况之一解决方案。也许一个R-纯粹主义者也会出现,并给出一个基本的R解决方案,但我打赌它看起来与Prasad的答案非常相似。Thx的详细解释。我真的在尝试越来越多地在R中解决这类问题,而不是回到SQL,因为其他原因,比如失去属性等,SQL也很麻烦。但它仍然有效使用不同行的结果也不是SQL的强项:)哇,这个问题,对我来说比我最初想象的更有趣。这是什么?@Andrie使用base R而不是plyr提供答案?奇迹永远不会停止;-)@GavinSimpson,我知道,这是一个令人震惊的问题。但是@Chase用ddply解决方案很快就能得出结论现在…这是一个很好的答案!太好了。我以前尝试过sqldf,但总是得到一个缺少的dbname错误。我是否需要做一些事情来初始化它(除了要求)?通常不需要在sqldf中指定
dbname
。您只需使用
库(sqldf)加载它即可
然后发出一个
sqldf
语句。如果它使用sqlite或h2,那么默认情况是使用内存中的数据库,因此不需要名称。也许您加载了RMySQL或RgpSQL包?如果加载了,那么sqldf将假定您要使用这些数据库,而不是sqlite。在这种情况下,您必须提供一个dbname,否则您将无法使用使用默认名称。如果已加载RMySQL或RpgSQL,请将其拆离,否则,无论加载了什么,您都可以使用
选项(sqldf.driver=“sqlite”)
强制使用sqlite。@ran2,如果您经常使用RMySQL,您可能更喜欢让sqldf处理它们,而不是sqlite。默认情况下,sqldf使用
dbname=“test”
使用RMySQL,因此如果您在MySQL中设置了这样一个数据库,那么您可以在该MySQL数据库中使用sqldf。或者,您可以使用
选项(RMySQL.dbname=“someotherdatabasename”)
将MySQL的默认dbname更改为其他名称。
> library(doBy)
> summaryBy(value ~ date, transform(DF, value = ((class == "A") - (class == "B")) * value), FUN = sum, keep.names = TRUE)
        date value
1 1984-04-01    -3
2 1984-04-02     3
3 1984-04-03     3
4 1984-04-04    -5
> library(remix)
> remix(value ~ date, transform(DF, value = ((class == "A") - (class == "B")) * value), sum)
value ~ date
============

+------+------------+-------+-----+
|                           | sum |
+======+============+=======+=====+
| date | 1984-04-01 | value | -3  |
+      +------------+-------+-----+
|      | 1984-04-02 | value | 3   |
+      +------------+-------+-----+
|      | 1984-04-03 | value | 3   |
+      +------------+-------+-----+
|      | 1984-04-04 | value | -5  |
+------+------------+-------+-----+
> library(Hmisc)
> summary(value ~ date, data = transform(DF, value = ((class == "A") - (class == "B")) * value), fun = sum, overall = FALSE)
value    N=8

+----+----------+-+-----+
|    |          |N|value|
+----+----------+-+-----+
|date|1984-04-01|2|-3   |
|    |1984-04-02|2| 3   |
|    |1984-04-03|2| 3   |
|    |1984-04-04|2|-5   |
+----+----------+-+-----+