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的答案,因为我更喜欢baseR
。然而,这里有一个使用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的答案,因为我更喜欢baseR
。然而,这里有一个使用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谢谢。这段代码完成了任务。它还保持行的顺序与它们第一次出现在原始数据集中的顺序相同。请考虑将您的代码发布为答案。