r - 当行的其余部分重复时,如何通过对一列的值求和来合并表

标签 r database dataframe dplyr

我在下面有这张表,其中除了用户列之外,每列的某些行都具有相同的值。我一直在尝试聚合 $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/

相关文章:

r - 如何复制数据框中的列

r - 在 R : conditionally dividing numeric values by 1000 中

java - Hibernate/JPA,每个关联实体的列上的唯一约束(例如 : each user cannot have duplicate entries but can be duplicates overall)

php - 如何从 MD5 转换为任何其他哈希值?

sql - 在父表和子表之间引入一个新表

python - 有没有有效的方法将 Pandas DataFrame 转换为 H2O Frame?

r - 需要一种有效的方法来将因子值从数据框的一列更改为另一列

R Treemap 标签在使用 fontsize.labels 设置为 0 作为顶级标签时不合理?

去除多边形中的孔

r - 如何在R中创建分布矩阵