如何跨列创建唯一标识符 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 中的变量,并对每个变量应用 match
。 match
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
我正在尝试准备数据以用于 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 中的变量,并对每个变量应用 match
。 match
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