R 通过唯一列对(B-A 和 A-B)和非唯一组合(B-A 或 A-B)对观察结果求和
R sum observations by unique column PAIRS (B-A and A-B) and NOT unique combinations (B-A or A-B)
我有一个看似简单的计算,其中我有一个由 4 列组成的数据框,如下所示(日期、出发地、目的地、计数)。我想按日期和独特的 ID1 和 ID2 对计数求和,这意味着 A-B 和 B-A 是一对。
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-1 Y Z 2
12-2 A B 1
12-2 B A 1
12-2 D E 1
12-2 E D 2
12-2 Y Z 2
根据日期集,我们可以通过唯一组合(例如 A-B、B-A、D-E、E-D 等)对 "Count" 列求和。但是,我想按唯一对对计数列求和 - 这意味着 A-B 也将包括 B-A。
理想情况下,我希望 table 按日期和唯一对汇总。
我翻遍了所有东西,dyplyr 的功能,例如变异、聚集、联合——都无济于事。
非常感谢任何见解或指出正确的方向。非常感谢
我们可以使用pmin
、pmax
按行排序,将其与'Date'一起用作分组变量,得到[=35的sum
=]
library(dplyr)
df1 %>%
group_by(Date, ID1n = pmin(ID1, ID2), ID2n = pmax(ID1, ID2)) %>%
summarise(Count = sum(Count)) %>%
#dplyr::select(ID1 = ID1n, ID2 = ID2n, Date, Count)
rename(ID1 = ID1n, ID2 = ID2n)
# A tibble: 6 x 4
# Groups: ID1, Date [6]
# ID1 ID2 Date Count
# <chr> <chr> <chr> <int>
#1 A B 12-1 2
#2 D E 12-1 3
#3 Y Z 12-1 2
#4 A B 12-2 2
#5 D E 12-2 3
#6 Y Z 12-2 2
或者如果 dplyr
中的 select
或 rename
有问题,则在 summarise
步骤停止并仅分配列名称
out <- df1 %>%
group_by(Date, ID1n = pmin(ID1, ID2), ID2n = pmax(ID1, ID2)) %>%
summarise(Count = sum(Count))
names(out)[1:2] <- c("ID1", "ID2")
或者对 'ID1'、'ID2' 列按行使用 base R
、sort
并通过 'Count' 得到 sum
其他变量
df1[c('ID1', 'ID2')] <- t(apply(df1[c('ID1', 'ID2')], 1, sort))
aggregate(Count ~ ., df1, sum)
# Date ID1 ID2 Count
#1 12-1 A B 2
#2 12-2 A B 2
#3 12-1 D E 3
#4 12-2 D E 3
#5 12-1 Y Z 2
#6 12-2 Y Z 2
数据
df1 <- structure(list(Date = c("12-1", "12-1", "12-1", "12-1", "12-1",
"12-2", "12-2", "12-2", "12-2", "12-2"), ID1 = c("A", "B", "D",
"E", "Y", "A", "B", "D", "E", "Y"), ID2 = c("B", "A", "E", "D",
"Z", "B", "A", "E", "D", "Z"), Count = c(1L, 1L, 1L, 2L, 2L,
1L, 1L, 1L, 2L, 2L)), class = "data.frame", row.names = c(NA,
-10L))
我有一个看似简单的计算,其中我有一个由 4 列组成的数据框,如下所示(日期、出发地、目的地、计数)。我想按日期和独特的 ID1 和 ID2 对计数求和,这意味着 A-B 和 B-A 是一对。
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-1 Y Z 2
12-2 A B 1
12-2 B A 1
12-2 D E 1
12-2 E D 2
12-2 Y Z 2
根据日期集,我们可以通过唯一组合(例如 A-B、B-A、D-E、E-D 等)对 "Count" 列求和。但是,我想按唯一对对计数列求和 - 这意味着 A-B 也将包括 B-A。
理想情况下,我希望 table 按日期和唯一对汇总。
我翻遍了所有东西,dyplyr 的功能,例如变异、聚集、联合——都无济于事。
非常感谢任何见解或指出正确的方向。非常感谢
我们可以使用pmin
、pmax
按行排序,将其与'Date'一起用作分组变量,得到[=35的sum
=]
library(dplyr)
df1 %>%
group_by(Date, ID1n = pmin(ID1, ID2), ID2n = pmax(ID1, ID2)) %>%
summarise(Count = sum(Count)) %>%
#dplyr::select(ID1 = ID1n, ID2 = ID2n, Date, Count)
rename(ID1 = ID1n, ID2 = ID2n)
# A tibble: 6 x 4
# Groups: ID1, Date [6]
# ID1 ID2 Date Count
# <chr> <chr> <chr> <int>
#1 A B 12-1 2
#2 D E 12-1 3
#3 Y Z 12-1 2
#4 A B 12-2 2
#5 D E 12-2 3
#6 Y Z 12-2 2
或者如果 dplyr
中的 select
或 rename
有问题,则在 summarise
步骤停止并仅分配列名称
out <- df1 %>%
group_by(Date, ID1n = pmin(ID1, ID2), ID2n = pmax(ID1, ID2)) %>%
summarise(Count = sum(Count))
names(out)[1:2] <- c("ID1", "ID2")
或者对 'ID1'、'ID2' 列按行使用 base R
、sort
并通过 'Count' 得到 sum
其他变量
df1[c('ID1', 'ID2')] <- t(apply(df1[c('ID1', 'ID2')], 1, sort))
aggregate(Count ~ ., df1, sum)
# Date ID1 ID2 Count
#1 12-1 A B 2
#2 12-2 A B 2
#3 12-1 D E 3
#4 12-2 D E 3
#5 12-1 Y Z 2
#6 12-2 Y Z 2
数据
df1 <- structure(list(Date = c("12-1", "12-1", "12-1", "12-1", "12-1",
"12-2", "12-2", "12-2", "12-2", "12-2"), ID1 = c("A", "B", "D",
"E", "Y", "A", "B", "D", "E", "Y"), ID2 = c("B", "A", "E", "D",
"Z", "B", "A", "E", "D", "Z"), Count = c(1L, 1L, 1L, 2L, 2L,
1L, 1L, 1L, 2L, 2L)), class = "data.frame", row.names = c(NA,
-10L))