我有一个数据集,其中包含不同个人对一系列变量的评级.每个人通过唯一的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)

我想找出所有变量中每个人的self 评价和他人评价之间的欧几里得距离.理想情况下,我希望最终结果如下所示:

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号),以获得每个个体的一个欧几里得距离输出值.

你对如何实现这一目标有什么建议吗?任何帮助非常感谢!

推荐答案

编辑:之后,我更喜欢@thelatmail‘S answer,以小组形式总结.

以下是purrr::map()的解决方案.这并不完全是一个循环(你可以在Advanced R中阅读有关泛函的内容).~ .x语法已经过时了,欢迎发表意见,这样我就可以改进了!

library(tidyverse)
df %>%
  split(.$id) %>% 
  map(~ .x %>%  select(v1:v3) %>% 
        dist() %>%as.numeric() %>% 
        as_tibble_col(column_name ="euclidean_distance" )) %>% 
  list_rbind(names_to="id")

顺便说一句,这是一个很好的最小可重现示例:)

R相关问答推荐

在数据表中呈现数学符号

从R中的另一个包扩展S3类的正确方法是什么

如何删除多个.CSV文件的行

在值和NA的行顺序中寻找中断模式

如果第一个列表中的元素等于第二个列表的元素,则替换为第三个列表的元素

如何直接从R中的风险分数计算c指数?

在ggplot2中更改小提琴情节的顺序

是否有新方法来更改Facet_WRAP(Ggplot2)中条文本的文本 colored颜色 ?

如何从向量构造一系列双边公式

为什么在写入CSV文件时Purrr::Pwalk不起作用

根据r中每行中的日期序列,使用列名序列创建新列

是否有一个R函数可以输出在输入的字符向量中找到的相应正则表达式模式?

将美学添加到ggploy中的文本标签

如何将图例文本添加到图例符号中

如何编辑被动式数据表?

随机生成样本,同时在R内的随机样本中至少包含一次所有值

从字符串01JAN2021创建日期

为什么R列名称忽略具有指定名称的向量,而只关注索引?

从字符串列中的向量中查找第一个匹配的单词

在子图内和子图之间对齐行数不均匀的表格罗布对