通过在 R 中聚合复杂的配对名称求和
Sum by aggregating complex paired names in R
在 R 中,我试图根据唯一 ID 聚合数据框,但我需要为 ID 使用某种通配符值。意思是我有这样的配对名称:
lion_tiger
elephant_lion
tiger_lion
我需要将 lion_tiger 和 tiger_lion ID 加在一起,因为这对中的顺序无关紧要。
以这个数据帧为例:
df <- data.frame(pair = c("1_3","2_4","2_2","1_2","2_1","4_2","3_1","4_3","3_2"),
value = c("12","10","19","2","34","29","13","3","14"))
所以 ID 对“1_2”和“2_1”的值需要在新的 table 中求和。该新行将显示为:
1_2 36
有什么建议吗?虽然我的示例将数字作为对 ID,但实际上我需要它来读取文本(如上面的 lion_tiger" 示例)。
我们可以将 'pair' 列拆分为 _
,然后将 sort
和 paste
拆分回去,在分组中按函数使用它以获得 sum
tapply(as.numeric(as.character(df$value)),
sapply(strsplit(as.character(df$pair), '_'), function(x)
paste(sort(as.numeric(x)), collapse="_")), FUN = sum)
或者另一种选择是gsubfn
library(gsubfn)
df$pair <- gsubfn('([0-9]+)_([0-9]+)', ~paste(sort(as.numeric(c(x, y))), collapse='_'),
as.character(df$pair))
df$value <- as.numeric(as.character(df$value))
aggregate(value~pair, df, sum)
使用 tidyverse 和 purrrlyr
df <- data.frame(name=c("lion_tiger","elephant_lion",
"tiger_lion"),value=c(1,2,3),stringsAsFactors=FALSE)
require(tidyverse)
require(purrrlyr)
df %>% separate(col = name, sep = "_", c("A", "B")) %>%
by_row(.collate = "rows",
..f = function(this_row) {
paste0(sort(c(this_row$A, this_row$B)), collapse = "_")
}) %>%
rename(sorted = ".out") %>%
group_by(sorted) %>%
summarize(sum(value))%>%show
## A tibble: 2 x 2
# sorted `sum(value)`
# <chr> <dbl>
#1 elephant_lion 2
#2 lion_tiger 4
在 R 中,我试图根据唯一 ID 聚合数据框,但我需要为 ID 使用某种通配符值。意思是我有这样的配对名称:
lion_tiger
elephant_lion
tiger_lion
我需要将 lion_tiger 和 tiger_lion ID 加在一起,因为这对中的顺序无关紧要。
以这个数据帧为例:
df <- data.frame(pair = c("1_3","2_4","2_2","1_2","2_1","4_2","3_1","4_3","3_2"),
value = c("12","10","19","2","34","29","13","3","14"))
所以 ID 对“1_2”和“2_1”的值需要在新的 table 中求和。该新行将显示为:
1_2 36
有什么建议吗?虽然我的示例将数字作为对 ID,但实际上我需要它来读取文本(如上面的 lion_tiger" 示例)。
我们可以将 'pair' 列拆分为 _
,然后将 sort
和 paste
拆分回去,在分组中按函数使用它以获得 sum
tapply(as.numeric(as.character(df$value)),
sapply(strsplit(as.character(df$pair), '_'), function(x)
paste(sort(as.numeric(x)), collapse="_")), FUN = sum)
或者另一种选择是gsubfn
library(gsubfn)
df$pair <- gsubfn('([0-9]+)_([0-9]+)', ~paste(sort(as.numeric(c(x, y))), collapse='_'),
as.character(df$pair))
df$value <- as.numeric(as.character(df$value))
aggregate(value~pair, df, sum)
使用 tidyverse 和 purrrlyr
df <- data.frame(name=c("lion_tiger","elephant_lion",
"tiger_lion"),value=c(1,2,3),stringsAsFactors=FALSE)
require(tidyverse)
require(purrrlyr)
df %>% separate(col = name, sep = "_", c("A", "B")) %>%
by_row(.collate = "rows",
..f = function(this_row) {
paste0(sort(c(this_row$A, this_row$B)), collapse = "_")
}) %>%
rename(sorted = ".out") %>%
group_by(sorted) %>%
summarize(sum(value))%>%show
## A tibble: 2 x 2
# sorted `sum(value)`
# <chr> <dbl>
#1 elephant_lion 2
#2 lion_tiger 4