我们可以使用base R
方法首先sort
按行计算前两列。我们用apply
with MARGIN=1
为此,转置输出,转换为“data.frame”以创建“df1”,使用公式方法aggregate
得到sum
按转换数据集的前两列分组的“num_email”。
df1 <- data.frame(t(apply(df[1:2], 1, sort)), df[3])
aggregate(num_email~., df1, FUN=sum)
# X1 X2 num_email
# 1 Beth Mable 2
# 2 Beth Susan 3
# 3 Mable Susan 1
或者使用data.table
,我们将前两列转换为character
class, unname
将前两列的列名更改为默认的“V1”、“V2”,并转换为“data.table”。使用字符列的字典顺序,我们为 i (V1 > V2
), 分配 (:=
) 通过反转列的顺序来满足条件的列 (.(V2, V1)
),并得到sum
按“V1”、“V2”分组的“num_email”。
library(data.table)
dt = do.call(data.table, c(lapply(unname(df[1:2]), as.character), df[3]))
dt[V1 > V2, c("V1", "V2") := .(V2, V1)]
dt[, .(num_email = sum(num_email)), by= .(V1, V2)]
# V1 V2 num_email
# 1: Beth Mable 2
# 2: Beth Susan 3
# 3: Mable Susan 1
或者使用dplyr
, 我们用mutate_each
将列转换为character
类,然后颠倒顺序pmin
and pmax
,按“V1”、“V2”分组并得到sum
“num_email”。
library(dplyr)
df %>%
mutate_each(funs(as.character), senders, receivers) %>%
mutate( V1 = pmin(senders, receivers),
V2 = pmax(senders, receivers) ) %>%
group_by(V1, V2) %>%
summarise(num_email=sum(num_email))
# V1 V2 num_email
# (chr) (chr) (dbl)
# 1 Beth Mable 2
# 2 Beth Susan 3
# 3 Mable Susan 1
注意:data.table
解决方案已由@Frank 更新。