我在处理以下问题。我想用日期和唯一的一对ID1和ID2相加,这意味着are和B是一对。但是,我希望将这两对和它们的和保留在我的数据集中。
我的数据集如下所示:
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预期输出如下所示:
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)
在此之前,非常感谢您。
发布于 2021-12-04 17:16:21
这也可以用pmin/pmax来创建分组列
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
# 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数据
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))发布于 2021-12-04 16:49:29
这里有个办法。
首先,在ID1和ID2列中创建一个排序值向量,并将它们粘贴到一起。然后用ave分组。最后,删除唯一值的向量。
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发布于 2021-12-04 17:02:22
下面是一个使用dplyr的lapply解决方案
本质上,我们创建了一个新的列y,该列按字母顺序排列字符,这样我们也可以对该列进行分组:
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)) 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 5https://stackoverflow.com/questions/70227510
复制相似问题