我在下面有这张表,其中除了用户列之外,每列的某些行都具有相同的值。我一直在尝试聚合 $users 列中的值,以便创建一个没有任何重复行的较短表格。
到目前为止,我已经尝试了两种不同的公式,但结果不同:
(1)
basex2=aggregate(base3$users, by=subset(base3,select=-users),FUN=sum)
(2)
basex3 = base3 %>%
group_by_all()%>%
summarise(users=sum(users))
然而,这两个公式产生了不同的结果。 (1)中,行数减少到18万左右(全帧超过1M);在(2)中,减少到129,000。
通过应用此代码 (3):
basex1 = base3 %>%
subset(select=-users) %>%
unique()
我能够确认我应该达到的实际数量约为 130,000,这意味着 (1) 和 (2) 不一致。此外,我能够轻松地在 (1) 中找到除用户列之外的所有内容都是重复的行; (2)中的用户总数略小于初始表中的用户总数。
我的问题是为什么这些函数会产生不同且不正确的结果,以及是否有更好的函数可以用来获得最佳表格。
# A tibble: 6 x 11
# Groups: date, country, country_ip, country_campaign, device, source,
# campaign, users, year, month [6]
date country country_ip country_campaign device source campaign users
<date> <chr> <chr> <chr> <chr> <chr> <dbl> <dbl>
1 2021-03-01 AE SA WW Android google un… 1.01e10 9
2 2021-03-01 AT AT WW Android google un… 1.01e10 11
3 2021-03-01 AT AT WW Android google un… 1.01e10 10
4 2021-03-01 AT AT WW Android google un… 1.01e10 4
5 2021-03-01 AU AU WW Android google un… 1.01e10 39
6 2021-03-01 AU AU WW Android google un… 1.01e10 4
# … with 3 more variables: year <dbl>, month <chr>, game <chr>
最佳答案
为什么输出不同的实际答案基于实际数据。但是,是的,这两个代码可以生成不同的输出。
考虑这个例子 -
set.seed(123)
base3 <- data.frame(a = c(1, 1, 2, 2, 2, 3),
b = c('a', 'a', 'b', 'b', 'b', NA),
c = rnorm(6))
base3
# a b c
#1 1 a -0.5605
#2 1 a -0.2302
#3 2 b 1.5587
#4 2 b 0.0705
#5 2 b 0.1293
#6 3 <NA> 1.7151
注意 b
中存在 NA
值。
当您使用默认设置的aggregate
时 -
aggregate(base3$c, by=subset(base3,select=-c),FUN=sum)
# a b x
#1 1 a -0.791
#2 2 b 1.759
您失去了 a = 3
的第三组。您的原始数据可以在 aggregate
必须删除的任何列中具有多个此类 NA
值。
就 dplyr
代码而言,无论如何它都不应该工作,因为您正在使用 group_by_all
这意味着您也在对 c
列进行分组(即实际数据集中的 users
列)。
library(dplyr)
base3 %>% group_by_all()%>% summarise(c=sum(c))
# a b c
# <dbl> <chr> <dbl>
#1 1 a -0.560
#2 1 a -0.230
#3 2 b 0.0705
#4 2 b 0.129
#5 2 b 1.56
#6 3 NA 1.72
在输出中,我们得到与原始数据相同的行数,因为 c
列中的每个值都是唯一的。相反,您应该做的是按除 c
之外的每一列进行分组,可以将其写为
base3 %>% group_by(across(-c))%>%summarise(c=sum(c))
# a b c
# <dbl> <chr> <dbl>
#1 1 a -0.791
#2 2 b 1.76
#3 3 NA 1.72
关于r - 当行的其余部分重复时,如何通过对一列的值求和来合并表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68030585/