我有一个数据集,其中包含各种个人对一堆变量的评分。每个人都通过唯一的 ID 号进行区分,对两个目标的每个变量进行评级:为自己(目标 = s)和其他人(目标 = o)。数据框的简化模型如下所示:
id <- c("123", "123", "234", "234", "345", "345", "456", "456", "567", "567")
target <- c("s", "o", "s", "o", "s", "o", "s", "o", "s", "o")
v1 <- c(1, 2, 3, 7, 2, 5, 4, 4, 1, 3)
v2 <- c(7, 6, 5, 7, 1, 3, 5, 4, 1, 1)
v3 <- c(2, 2, 2, 4, 5, 2, 7, 1, 3, 3)
df <- data.frame(id, target, v1, v2, v3)
我想找到所有变量中每个人的自我评分和其他人评分之间的欧几里德距离。理想情况下,我希望最终结果看起来像这样:
id <- c("123", "234", "345", "456", "567")
euclidean_distance <- c(1.414214, 4.898979, 4.690416, 6.082763, 2)
df_final <- data.frame(id, euclidean_distance)
我如何为一个人做这件事的一个例子是:
id_123 <- df %>%
filter(id == 123)
dist(select(id_123, v1:v3))
但是,一次完成一个需要很长时间(我的实际数据集有数百个人,而不仅仅是 5 个),而且我更有可能在一次手工完成所有这些工作时出现转录错误。因此,我试图找出一种方法来迭代所有个体(即每个唯一的 ID 号)以获得每个个体的一个欧几里得距离输出值。
您对如何实现这一目标有什么建议吗?非常感谢任何帮助!
这里有一个解决方案
purrr::map()
。它不完全是一个循环(您可以在Advanced R中阅读有关泛函的内容)。 ~ .x
语法已经过时,欢迎评论,以便我改进!
df %>%
split(.$id) %>%
map(~ .x %>% select(v1:v3) %>%
dist() %>%as.numeric() %>%
as_tibble_col(column_name ="euclidean_distance" )) %>%
list_rbind(names_to="id")
顺便说一句,很好的最小可重现示例:)