R:如何为数据帧中的无序对创建ID变量

时间:2019-04-18 00:54:25

标签: r

我有一个数据框,其中包含有关成对的国家/地区之间贸易流量的变量,其中一个国家/地区是每行的出口国,一个国家/地区是进口商。

我想创建一个ID号变量,以标识每个 unordered 国家/地区对,为每个对赋予相同的ID号,而不管哪个是出口商,哪个是进口商。因此,澳大利亚-美国将具有与美国-澳大利亚相同的ID,但与澳大利亚-英国具有不同的ID。

这是带有ID变量的数据的示例。

Controller:

if("lnKrequestID".equals(action)){

if(request.getParameter("paramSetStatusRequestType")!= null ){

String requestId=request.getParameter("paramRequestID"); // Here i am 
getting value at all time
//Some code..
}}

我的数据集大约有200万行,包括47年中的大约44,000个国家/地区对。

我已经使用以下代码为每个订购国家对创建一个ID。

YEAR     ISO_EXP     ISO_IMP     UNORD_PAIR_ID
1970     AUS         GBR         1
1970     AUS         USA         2
1970     AUS         ZIM         3
1970     GBR         AUS         1
1970     GBR         USA         4
1970     GBR         ZIM         5
1970     USA         AUS         2
1970     USA         GBR         4
1970     USA         ZIM         6
1970     ZIM         AUS         3
1970     ZIM         GBR         5
1970     ZIM         USA         6

但是我还无法弄清楚如何为无序对创建ID。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:0)

我们可以使用pmin/pmax对ISO_EXP,ISO_IMP中相同的元素进行排序,并在group_indices中使用它们

library(dplyr)
df1 %>%  
    mutate(pairid = group_indices(., pmax(ISO_EXP, ISO_IMP), 
                                     pmin(ISO_EXP, ISO_IMP)))
#   YEAR ISO_EXP ISO_IMP UNORD_PAIR_ID pairid
#1  1970     AUS     GBR             1      1
#2  1970     AUS     USA             2      2
#3  1970     AUS     ZIM             3      4
#4  1970     GBR     AUS             1      1
#5  1970     GBR     USA             4      3
#6  1970     GBR     ZIM             5      5
#7  1970     USA     AUS             2      2
#8  1970     USA     GBR             4      3
#9  1970     USA     ZIM             6      6
#10 1970     ZIM     AUS             3      4
#11 1970     ZIM     GBR             5      5
#12 1970     ZIM     USA             6      6

或使用base R

v1 <- do.call(paste, as.data.frame(t(apply(df1[2:3], 1, sort))))
df1$pairid <-  match(v1, unique(v1))

数据

df1 <- structure(list(YEAR = c(1970L, 1970L, 1970L, 1970L, 1970L, 1970L, 
 1970L, 1970L, 1970L, 1970L, 1970L, 1970L), ISO_EXP = c("AUS", 
  "AUS", "AUS", "GBR", "GBR", "GBR", "USA", "USA", "USA", "ZIM", 
  "ZIM", "ZIM"), ISO_IMP = c("GBR", "USA", "ZIM", "AUS", "USA", 
  "ZIM", "AUS", "GBR", "ZIM", "AUS", "GBR", "USA"), UNORD_PAIR_ID = c(1L, 
  2L, 3L, 1L, 4L, 5L, 2L, 4L, 6L, 3L, 5L, 6L)), class = "data.frame", 
  row.names = c(NA, -12L))