【问题标题】:Use unique pairs of column values to generate dyad identifiers in the dataframe使用唯一的列值对在数据框中生成二元标识符
【发布时间】:2019-08-11 16:24:45
【问题描述】:

我想为双边贸易流数据帧(以fromtoamount 交易格式编码)生成一组二元标识符,以便我可以使用这些标识符进行进一步的统计分析。

下面提供了我的示例数据,我从中提取并识别了涉及美国的数据中的独特国家对。

# load the example data
trade_flow <- readRDS(gzcon(url("https://www.dropbox.com/s/ep7xldoq9go4f0g/trade_flow.rds?dl=1")))
# extract country dyads
country_dyad <- trade_flow[, c("from", "to")]
# identify unique pairs
up <- country_dyad[!duplicated(t(apply(country_dyad, 1, sort))),]
# extract only unique pairs that involve the US
up <- up[(up$from == "USA") | (up$to == "USA"), ]

## how can I use the unique pair object (up) to generate dyad identifiers and include them as a new column in the trade_flow dataframe

下一步是将原始数据帧的 (trade_flow) fromto 列中的这些唯一 dyad 对匹配,并生成唯一 dyad 标识符列表作为新列(例如,dyad)到df (trade_flow)。它应该类似于下面的格式,其中每个唯一的二元组都被识别并编码为唯一的数值。如果有人可以帮助我,我将不胜感激。

from    to  trade_flow  dyad
USA   ITA      5100       2
USA   UKG      4000       1
USA   GMY     17000       3
USA   ITA      4500       2
USA   JPN      2900       4
USA   UKG      6700       1
USA   ROK      7000       5
USA   UKG      2300       1
USA   SAF      1500       6
IND   USA      2400       7

【问题讨论】:

    标签: r unique hierarchical-data pairwise


    【解决方案1】:

    假设流是定向的,因此 A/B 和 B/A 是不同的流,请将 fromto 列粘贴在一起并转换为因子。 factor 使用的内部代码是 1、2、...、no_of_levels,提取这些代码使用as.numeric

    transform(DF, dyad = as.numeric(factor(paste(from, to))))
    

    给予:

       from  to trade_flow dyad
    1   USA ITA       5100    3
    2   USA UKG       4000    7
    3   USA GMY      17000    2
    4   USA ITA       4500    3
    5   USA JPN       2900    4
    6   USA UKG       6700    7
    7   USA ROK       7000    5
    8   USA UKG       2300    7
    9   USA SAF       1500    6
    10  IND USA       2400    1
    

    将子集上的分配应用于整体

    如果我们只想对DF 的行子集执行此分配,例如head(DF),然后将这些分配用于所有DF,对DF 中不在的流使用NA DF0 然后首先执行上面的二元分配(见下面的第一行),然后从DF0 中删除流号,并使用unique 提取其唯一行。最后使用all.x=TRUE 将其与前两列的DF 合并,这样DF 中的不匹配行就不会被删除。

    DF0 <- transform(head(DF), dyad = as.numeric(factor(paste(from, to))))
    merge(DF, unique(DF0[-3]), all.x = TRUE, by = 1:2)
    

    给予:

       from  to trade_flow dyad
    1   IND USA       2400   NA
    2   USA GMY      17000    1
    3   USA ITA       4500    2
    4   USA ITA       5100    2
    5   USA JPN       2900    3
    6   USA ROK       7000   NA
    7   USA SAF       1500   NA
    8   USA UKG       4000    4
    9   USA UKG       2300    4
    10  USA UKG       6700    4
    

    注意

    以可重现的形式输入:

    Lines <- "from to trade_flow
    USA   ITA      5100       
    USA   UKG      4000       
    USA   GMY     17000       
    USA   ITA      4500       
    USA   JPN      2900       
    USA   UKG      6700       
    USA   ROK      7000       
    USA   UKG      2300       
    USA   SAF      1500       
    IND   USA      2400"
    DF <- read.table(text = Lines, header = TRUE)
    

    【讨论】:

    • 您好,感谢您的回复,但如果我想使用子集的国家 dyads (up) 在“完整数据” (trade_flow) 上生成 dyad 标识符,同时保留其余部分观察(行)为 NA(或简单地将它们设置为组 0),我应该修改代码的哪一部分?谢谢。
    • 如果您要做的是对行子集执行分配,然后将该分配应用于所有行,请参阅答案中添加的部分。
    • 看来,如果我将 dyad i-j 视为无向并使用它来匹配数据框中的 fromto 列并为涉及的所有行生成 dyad 标识符ij(包括 j-i 链接),它将使 from = j & to = i 的行不匹配。因此,R 将返回一条错误消息,显示原始数据帧和唯一 dyads 列表之间的“行数不同”。
    • 我想解决我的问题的另一种方法是:如果我们假设 i-j dyad 是无向的,推荐的方法将同时计算 i-jj -i 作为不同的 dyads 并为它们分配一个唯一的数字指示符。有没有办法为 i-jj-i 对分配相同的二元组指标?
    • 使用 paste(pmin(as.character(from), as.character(to)), pmax(as.character(from), as.character(to))) 会导致 dyads 以无向的方式分配。
    【解决方案2】:

    这是一个使用base R的选项

    df1$dyad <- with(df1, as.integer(droplevels(interaction(from, to, 
            lex.order = TRUE))))
    df1$dyad
    #[1] 3 7 2 3 4 7 5 7 6 1
    

    数据

    df1 <- structure(list(from = structure(c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 
    2L, 2L, 1L), .Label = c("IND", "USA"), class = "factor"), to = structure(c(2L, 
    6L, 1L, 2L, 3L, 6L, 4L, 6L, 5L, 7L), .Label = c("GMY", "ITA", 
    "JPN", "ROK", "SAF", "UKG", "USA"), class = "factor"), trade_flow = c(5100L, 
    4000L, 17000L, 4500L, 2900L, 6700L, 7000L, 2300L, 1500L, 2400L
    )), class = "data.frame", row.names = c(NA, -10L))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-06
      • 1970-01-01
      • 2010-09-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多