首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用唯一列对( by和A)而非唯一组合(by或A)观测R和

用唯一列对( by和A)而非唯一组合(by或A)观测R和
EN

Stack Overflow用户
提问于 2020-03-29 18:55:07
回答 1查看 421关注 0票数 2

我有一个看似简单的计算,其中我有一个由4列组成的数据框架,如下所示(日期、起源、目的地、计数)。我想用日期和唯一的一对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-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、D、etc等)将“计数”列相加。然而,我想用唯一的对来和计数列,这意味着A也将包括B。

理想情况下,我希望按日期和独特的一对表进行总结。

我看遍了所有的东西,像突变、聚集、联合这样的功能--都是徒劳的。

如果你有任何见解或指出正确的方向,我将不胜感激。非常感谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-29 18:56:40

我们可以使用pminpmax按行进行排序,将其与“日期”一起用作分组变量,并获得“计数”的sum

代码语言:javascript
复制
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

或者,如果select或来自dplyrrename是错误的,那么在summarise步骤中停下来,只分配列名

代码语言:javascript
复制
out <-  df1 %>% 
  group_by(Date, ID1n = pmin(ID1, ID2), ID2n = pmax(ID1, ID2)) %>% 
  summarise(Count = sum(Count)) 
names(out)[1:2] <- c("ID1", "ID2")

或使用base R,对“ID1”、“ID2”列按行进行sort,并通过其他变量获得“Count”的sum

代码语言:javascript
复制
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

数据

代码语言:javascript
复制
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))
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60919244

复制
相关文章

相似问题

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