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

时间:2017-09-28 13:51:36

标签: r numeric recode

我正在尝试准备用于R和Gephi中的各种网络可视化应用程序的数据。这些格式需要在两个数据库之间链接的数字标识符我已经找到了后一部分,但是我无法找到一种简洁的方法来在数据框中的列之间创建数字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

4 个答案:

答案 0 :(得分:4)

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

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

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

在这里,sapply循环遍历org.data中的变量,并将match应用于每个变量。 match返回表参数中第一个参数的位置。这里,table是org.data中未列出的唯一元素:unique(unlist(org.data))。在这种情况下,sapply返回一个矩阵。它将转换为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和{{1 }}

data.frame

这两个都返回

desired.data <- org.data

答案 1 :(得分:3)

你可以试试这个:

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

答案 2 :(得分:0)

您可以尝试以下操作。我们的想法是使用所有唯一名称的级别创建因子。

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

答案 3 :(得分:0)

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

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