我有一个数据框,其中包含有关成对的国家/地区之间贸易流量的变量,其中一个国家/地区是每行的出口国,一个国家/地区是进口商。
我想创建一个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。
任何帮助都将不胜感激。
答案 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))