我有一个关于npi的数据集,其中包含主要在字符串变量中的那些npi的信息
但是我为这个例子简单地说了一遍
data <- as.data.frame(cbind(51:60, sample(1:10, 10, replace = T), sample(1:10, 10, replace = T), sample(1:10, 10, replace = T)), stringsAsfactors = F)
colnames(data) <- c("npi", "a", "b", "c")
例如:
npi a b c
51 6 2 1
52 6 2 6
53 10 9 2
54 7 4 7
55 7 10 5
56 8 5 7
57 7 2 10
58 5 9 3
59 8 4 6
60 1 10 2
我想创建一个距离矩阵,显示不同NPI之间的相对距离 我希望它们在它们不相似时有很大的距离,当它们非常相似时需要很小的距离。与我相似,我的意思是他们分享变量的价值。真实数据集中的变量是名称和地址,所以我不能简单地使用dist()。
这就是我得到两个npi之间的距离
length(intersect(npi1,npi2))/3
但我不知道如何创建循环或函数来遍历整个数据集并给我一个这样的距离矩阵:
51 52 53 54 55 56 57 58 59 60
51 0 distance 51 to 52
52 0
53 0
54 0
55 0
56 0
57 0
58 0
59 0
60 0
您是否能够指出我正确的方向使用哪种循环或函数来解决这个问题?
答案 0 :(得分:2)
希望这有帮助!
#sample data
df <- read.table(text='npi a b c
51 6 2 1
52 6 2 6
53 10 9 2
54 7 4 7
55 7 10 5
56 8 5 7
57 7 2 10
58 5 9 3
59 8 4 6
60 1 10 2', header=T, sep='')
#convert 1st column of data as the row index
df1 <- df[,-1]
rownames(df1) <- df[,1]
#calculate distance
library(proxy)
dist_func <- function(x, y) length(intersect(x,y))/3
proxy::dist(df1, method = dist_func)