我正在尝试准备用于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
答案 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