如何跨列创建唯一标识符 ID?

How to create a unique identifier ID across columns?

我正在尝试准备数据以用于 R 和 Gephi 中的各种网络可视化应用程序。这些格式需要两个数据库之间 link 的数字标识符。我已经弄清楚了后一部分,但我无法找到一种简洁的方法来在数据框中跨列创建数字 ID 变量。这是一些可复制的代码,说明了我正在尝试做的事情。

org.data <- data.frame(source=c('bob','sue','ann','john','sinbad'),
       target=c('sinbad','turtledove','Aerosmith','bob','john'))

desired.data <- data.frame(source=c('1','2','3','4','5'),
                       target=c('5','6','7','1','4'))


org.data

  source     target
1    bob     sinbad
2    sue     turtledove
3    ann     Aerosmith
4    john    bob
5    sinbad  john

desired.data

  source target
1    1      5
2    2      6
3    3      7
4    4      1
5    5      4

你可以试试这个:

org.data[] <- as.numeric(factor(c(as.matrix(org.data)), levels = unique(c(as.matrix(org.data)))))
org.data
  source target
1      1      5
2      2      6
3      3      7
4      4      1
5      5      4

您可以尝试关注。这个想法是使用所有唯一名称的级别来创建因子。

library(tidyverse)
org.data %>% 
  mutate(source2 = factor(source, levels=unique(unlist(org.data)) ,  labels=1:length(unique(unlist(org.data))))) %>% 
  mutate(target2 = factor(target, levels=unique(unlist(org.data)) ,  labels=1:length(unique(unlist(org.data)))))
  source     target source2 target2
1    bob     sinbad       1       5
2    sue turtledove       2       6
3    ann  Aerosmith       3       7
4   john        bob       4       1
5 sinbad       john       5       4

转换为因子,然后转换为整数。

org.data <- data.frame(source=c('bob','sue','ann','john','sinbad'),
                       target=c('sinbad','turtledove','Aerosmith','bob','john'))

# need to make sure that columns are characters, not factors
org.data$source <- as.character(org.data$source)
org.data$target <- as.character(org.data$target)

# define possible values that cover the two columns
levels <- unique(c(org.data$source, org.data$target))

# factorize, then cast to integer
org.data$source <- as.integer(factor(org.data$source, levels=levels))
org.data$target <- as.integer(factor(org.data$target, levels=levels))

org.data

这是一个基本的 R 方法,使用 match 原始 data.frame 中未列出的唯一名称。

要替换当前的 data.frame,请使用

org.data[] <- sapply(org.data, match, table=unique(unlist(org.data)))

此处,sapply 循环遍历 org.data 中的变量,并对每个变量应用 matchmatch returns 第一个参数在 table 参数中的位置。这里,table 是 org.data 中未列出的唯一元素:unique(unlist(org.data))。在这种情况下,sapply return 是一个矩阵。它被转换为 data.frame,通过将 [] 附加到 org.data[] <- 中的 org.data 来替换原来的。这种构造可以认为是在赋值时保留了原始对象的结构。

要构建新的 data.frame,请使用

setNames(data.frame(sapply(org.data, match, table=unique(unlist(org.data)))),
         names(org.data))

或者更好,正如 Henrik 所建议的,首先创建 data.frame 的副本然后使用第一行代码填充副本可能比使用 setNames 更容易和 data.frame.

desired.data <- org.data

这两个return

  source target
1      1      5
2      2      6
3      3      7
4      4      1
5      5      4