首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R用唯一的列对(B和and )计算值的和,同时保持这两个对。

R用唯一的列对(B和and )计算值的和,同时保持这两个对。
EN

Stack Overflow用户
提问于 2021-12-04 16:31:00
回答 3查看 112关注 0票数 3

我在处理以下问题。我想用日期和唯一的一对ID1和ID2相加,这意味着are和B是一对。但是,我希望将这两对和它们的和保留在我的数据集中。

我的数据集如下所示:

代码语言:javascript
复制
Date ID1 ID2 Count
12-1   A   B   1
12-1   B   A   1
12-1   D   E   1
12-1   E   D   2
12-2   Y   Z   2
12-2   Z   Y   3

预期输出如下所示:

代码语言:javascript
复制
Date ID1 ID2 SUM
12-1   A   B   2
12-1   B   A   2
12-1   D   E   3
12-1   E   D   3
12-2   Y   Z   5
12-2   Z   Y   5

我的问题可以看作是对前一个问题的延伸:

R sum observations by unique column PAIRS (B-A and A-B) and NOT unique combinations (B-A or A-B)

在此之前,非常感谢您。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-12-04 17:16:21

这也可以用pmin/pmax来创建分组列

代码语言:javascript
复制
library(dplyr)
library(stringr)
df1 %>% 
   group_by(Date, grp = str_c(pmin(ID1, ID2), pmax(ID1, ID2))) %>% 
   mutate(Sum = sum(Count)) %>%
   ungroup %>%
   select(-grp)

-output

代码语言:javascript
复制
# A tibble: 6 × 5
  Date  ID1   ID2   Count   Sum
  <chr> <chr> <chr> <int> <int>
1 12-1  A     B         1     2
2 12-1  B     A         1     2
3 12-1  D     E         1     3
4 12-1  E     D         2     3
5 12-2  Y     Z         2     5
6 12-2  Z     Y         3     5

数据

代码语言:javascript
复制
df1 <- structure(list(Date = c("12-1", "12-1", "12-1", "12-1", "12-2", 
"12-2"), ID1 = c("A", "B", "D", "E", "Y", "Z"), ID2 = c("B", 
"A", "E", "D", "Z", "Y"), Count = c(1L, 1L, 1L, 2L, 2L, 3L)),
 class = "data.frame", row.names = c(NA, 
-6L))
票数 2
EN

Stack Overflow用户

发布于 2021-12-04 16:49:29

这里有个办法。

首先,在ID1ID2列中创建一个排序值向量,并将它们粘贴到一起。然后用ave分组。最后,删除唯一值的向量。

代码语言:javascript
复制
df1$unique <- apply(df1[c("ID1", "ID2")], 1, \(x) paste(sort(x), collapse = ""))
df1$Sum <- with(df1, ave(Count, unique, FUN = sum))
df1$unique <- NULL
df1
#  Date ID1 ID2 Count Sum
#1 12-1   A   B     1   2
#2 12-1   B   A     1   2
#3 12-1   D   E     1   3
#4 12-1   E   D     2   3
#5 12-2   Y   Z     2   5
#6 12-2   Z   Y     3   5
票数 3
EN

Stack Overflow用户

发布于 2021-12-04 17:02:22

下面是一个使用dplyrlapply解决方案

本质上,我们创建了一个新的列y,该列按字母顺序排列字符,这样我们也可以对该列进行分组:

代码语言:javascript
复制
library(dplyr)
library(stringr)

df %>% 
  mutate(x = paste(ID1, ID2)) %>% 
  mutate(y = str_split(x, ' ') %>% lapply(., 'sort') %>%  lapply(., 'paste', collapse=' ')) %>% 
  group_by(Date, y) %>% 
  mutate(SUM = sum(Count)) %>% 
  ungroup() %>% 
  select(-c(x, y, Count))
代码语言:javascript
复制
  Date  ID1   ID2     SUM
  <chr> <chr> <chr> <int>
1 12-1  A     B         2
2 12-1  B     A         2
3 12-1  D     E         3
4 12-1  E     D         3
5 12-2  Y     Z         5
6 12-2  Z     Y         5
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70227510

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档