R 按行广义聚合

R 按行广义聚合,r,aggregate,R,Aggregate,我想按行汇总。我知道如何做到这一点,并在这里回答了其他人提出的一些问题。但是,我想推广聚合公式,理想情况下,聚合行的顺序不会与它们在原始数据集中首次出现的顺序不同 以下是一个示例集: my.data <- read.table(text = ' 0 0 0 1 0 0 0 1 2 2 2 2 2 2 2 2 0 4 0 0 0 4 0 0 2 2 0 0 2 2 0 0 2 2 0 0 2 2 0 0 ', h

我想按行汇总。我知道如何做到这一点,并在这里回答了其他人提出的一些问题。但是,我想推广聚合公式,理想情况下,聚合行的顺序不会与它们在原始数据集中首次出现的顺序不同

以下是一个示例集:

my.data <- read.table(text = '
    0 0 0 1
    0 0 0 1
    2 2 2 2
    2 2 2 2
    0 4 0 0
    0 4 0 0
    2 2 0 0
    2 2 0 0
    2 2 0 0
    2 2 0 0
', header = FALSE)
下面是一个概括聚合公式的失败尝试:

with(my.data, aggregate(my.data[,ncol(my.data)], by = list(paste0('V', seq(1, ncol(my.data)-1))), FUN = sum))
结果的顺序不如概括重要


谢谢您的建议。

由于结果表明所需的结果只是唯一行的频率计数,您可以/应该使用
表(如注释中所述)<代码>表格
对其参数和系数使用
因子
,如果未指定“级别”,则
排序
s其输入的
唯一
唯一
不排序)指定级别。因此,对于
table
要“查看”您的级别(即所需的行顺序),您需要在明确指定的
因子上调用
table

tmp = do.call(paste, my.data)
as.data.frame(table(tmp))
#      tmp Freq
#1 0 0 0 1    2
#2 0 4 0 0    2
#3 2 2 0 0    4
#4 2 2 2 2    2    
res = table(factor(tmp, unique(tmp)))
as.data.frame(res)
#     Var1 Freq
#1 0 0 0 1    2
#2 2 2 2 2    2
#3 0 4 0 0    2
#4 2 2 0 0    4
您可以利用
unique.data.frame
并使用如下调用,而不是将
作为.data.frame.table调用(行已连接在一起):

data.frame(unique(my.data), unclass(res))
#  V1 V2 V3 V4 unclass.res.
#1  0  0  0  1            2
#3  2  2  2  2            2
#5  0  4  0  0            2
#7  2  2  0  0            4

由于结果表明所需的结果只是唯一行的频率计数,因此您可以/应该使用
(如注释中所述)<代码>表格
对其参数和系数使用
因子
,如果未指定“级别”,则
排序
s其输入的
唯一
唯一
不排序)指定级别。因此,对于
table
要“查看”您的级别(即所需的行顺序),您需要在明确指定的
因子上调用
table

tmp = do.call(paste, my.data)
as.data.frame(table(tmp))
#      tmp Freq
#1 0 0 0 1    2
#2 0 4 0 0    2
#3 2 2 0 0    4
#4 2 2 2 2    2    
res = table(factor(tmp, unique(tmp)))
as.data.frame(res)
#     Var1 Freq
#1 0 0 0 1    2
#2 2 2 2 2    2
#3 0 4 0 0    2
#4 2 2 0 0    4
您可以利用
unique.data.frame
并使用如下调用,而不是将
作为.data.frame.table调用(行已连接在一起):

data.frame(unique(my.data), unclass(res))
#  V1 V2 V3 V4 unclass.res.
#1  0  0  0  1            2
#3  2  2  2  2            2
#5  0  4  0  0            2
#7  2  2  0  0            4

可能需要指出的是,
plyr
包中的
count
函数也可以快速聚合。尽管如此,仍然会丢失原始的行顺序

> library(plyr)
> x <- count(my.data)
> x
##   V1 V2 V3 V4 freq
## 1  0  0  0  1    2
## 2  0  4  0  0    2
## 3  2  2  0  0    4
## 4  2  2  2  2    2

可能需要指出的是,
plyr
包中的
count
函数也可以快速聚合。尽管如此,仍然会丢失原始的行顺序

> library(plyr)
> x <- count(my.data)
> x
##   V1 V2 V3 V4 freq
## 1  0  0  0  1    2
## 2  0  4  0  0    2
## 3  2  2  0  0    4
## 4  2  2  2  2    2

我喜欢贴出的答案,尤其是@alexis_laz的答案,因为我更喜欢base
R
。然而,这里有一个使用
aggregate
的一般答案。输出中的行的顺序与原始数据集中第一次出现的顺序不同,但至少对行进行了计数:

我从@alexis_laz的评论中借用了
聚合中的

my.data <- read.table(text = '

    0 0 0 1
    0 0 0 1
    2 2 2 2
    2 2 2 2
    0 4 0 0
    0 4 0 0
    2 2 0 0
    2 2 0 0
    2 2 0 0
    2 2 0 0

', header = FALSE)

my.data

my.count = rep(1, nrow(my.data))
my.count

aggregate(my.count ~ ., FUN = sum, data=my.data)

  V1 V2 V3 V4 my.count
1  2  2  0  0        4
2  0  4  0  0        2
3  0  0  0  1        2
4  2  2  2  2        2 

my.data我喜欢贴出的答案,尤其是@alexis_laz的答案,因为我更喜欢base
R
。然而,这里有一个使用
aggregate
的一般答案。输出中的行的顺序与原始数据集中第一次出现的顺序不同,但至少对行进行了计数:

我从@alexis_laz的评论中借用了
聚合中的

my.data <- read.table(text = '

    0 0 0 1
    0 0 0 1
    2 2 2 2
    2 2 2 2
    0 4 0 0
    0 4 0 0
    2 2 0 0
    2 2 0 0
    2 2 0 0
    2 2 0 0

', header = FALSE)

my.data

my.count = rep(1, nrow(my.data))
my.count

aggregate(my.count ~ ., FUN = sum, data=my.data)

  V1 V2 V3 V4 my.count
1  2  2  0  0        4
2  0  4  0  0        2
3  0  0  0  1        2
4  2  2  2  2        2 

my.data当你说“generalize”时,你的意思是像
aggregate(V5~,my.data,sum)
?@alexis_laz我不知道你的意思。您的代码没有运行。我已经提供了期望的结果。请让我知道如何澄清。此外,V5不是通用的。它只适用于有五列的情况。对不起,我认为“V5”在您的示例数据集中是理所当然的。如果您只是查找行的频率计数,那么您可以使用
table
而不是
aggregate
?或者这只是一个简化的问题?例如
tmp=do.call(粘贴,我的数据);data.frame(unique(my.data),unclass(table)(factor(tmp,unique(tmp ')))
@alexis_-laz谢谢。这段代码完成了任务。它还保持行的顺序与它们第一次出现在原始数据集中的顺序相同。请考虑把你的代码作为一个答案。当你说“泛化”时,你的意思是“代码>聚合(V5~,My.DATA,SUM)< /代码>?@ AlxixLaz,我不确定你的意思。您的代码没有运行。我已经提供了期望的结果。请让我知道如何澄清。此外,V5不是通用的。它只适用于有五列的情况。对不起,我认为“V5”在您的示例数据集中是理所当然的。如果您只是查找行的频率计数,那么您可以使用
table
而不是
aggregate
?或者这只是一个简化的问题?例如
tmp=do.call(粘贴,我的数据);data.frame(unique(my.data),unclass(table)(factor(tmp,unique(tmp ')))
@alexis_-laz谢谢。这段代码完成了任务。它还保持行的顺序与它们第一次出现在原始数据集中的顺序相同。请考虑将您的代码发布为答案。