匹配R中的字符串的非顺序组合并基于组合折叠数据框

时间:2018-04-19 02:57:33

标签: r string

我有这样的数据:

table <- data.frame(col1 = c("USA", "CHN", "DEU", "DEU"), col2 = c("DEU", "DEU", "USA", "CHN"), col3 = c(100, 150, 300, 250))

  col1 col2 col3
1  USA  DEU  100
2  CHN  DEU  150
3  DEU  USA  300
4  DEU  CHN  250

如何根据col1和col2中值的组合折叠此表,而不依赖于此组合的序列 - 以便我有下表?

  col1 col2 col3
1  USA  DEU  400
2  CHN  DEU  400

非常感谢您提供的任何建议

更新:请点击此处查看更新数据:

AUS AUS 431.92164
AUS AUS 581.14942
AUS AUS 1822.10345
AUS AUS 1024.4436
AUS AUS 126.45221
AUS AUS 171.01716
AUS AUS 432.23415
AUS AUS 35.28675
AUS AUS 1488.02559
AUS AUS 0
AUS AUS 9057.73836
AUS AUS 9933.79762
AUS AUS 4307.49845
AUS AUS 73.33633
AUT AUT 1089.27094
AUT AUT 413.83978
AUT AUT 118.46822
AUT AUT 3700.34366

1 个答案:

答案 0 :(得分:1)

以下是使用aggregate的基本R解决方案:

table[, 1:2] <- t(apply(table[, 1:2], 1, sort))    
aggregate(col3 ~ col1 + col2, table, sum)
#  col1 col2 col3
#1  CHN  DEU  400
#2  DEU  USA  400

说明:第一行使用sort重新排序前两列中的条目,然后根据aggregate和{中的条目使用col3汇总col1个条目{1}}。

或使用col2方法:

tidyverse

更新

使用您的更新数据

library(tidyverse);
table %>%
    mutate_if(is.factor, as.character) %>%
    rowwise() %>%
    mutate(tmp = paste(sort(c(col1, col2)), collapse = "_")) %>%
    ungroup() %>%
    group_by(tmp) %>%
    summarise(col3 = sum(col3)) %>%
    separate(tmp, c("col1", "col2"))
## A tibble: 2 x 3
#  col1  col2   col3
#  <chr> <chr> <dbl>
#1 CHN   DEU    400.
#2 DEU   USA    400.