"加入&#34?;在行中的不同值,然后匹配

时间:2015-10-22 00:08:09

标签: r

为可怕的标题道歉,不知道如何描述我的问题。

我有一个如下所示的数据集:

----------------------------------
| media_id | filename | duration |
----------------------------------
|  782363  | 000041f1 |   12577  |
----------------------------------
|  782379  | 000041f1 |   12570  |
----------------------------------
|  1449109 | 00006c9b |  530423  |
----------------------------------
|  1449160 | 00006c9b |  530420  |
----------------------------------

我想要做的是匹配唯一的文件名(最多只能匹配两行),如下所示:

----------------------------------------------------------
| media_id | filename | duration | filename2 | duration2 |
----------------------------------------------------------
|  782363  | 000041f1 |   12577  | 000041f1  |   12570   |
----------------------------------------------------------
|  1449109 | 00006c9b |  530423  | 00006c9b  |  530420   |
----------------------------------------------------------

目的是计算持续时间和持续时间之间的绝对差值2.对于上下文,原始文件名具有不同的文件扩展名,但我已将其截断,因为这是我需要匹配持续时间的方式。我试图查看fileA在从一种格式转换为另一种格式后是否与fileB不同。

我熟悉dplyr,但我能想出的最佳算法是

1-Identify the unique filenames
2-Search through the filename column using grep to locate the rows where the filenames are located
3-Somehow transform, or create a new data frame, that matches the filenames.

任何想法/建议?数据集将有大约100万行,所以理想情况下我需要一些性能相当的东西。

2 个答案:

答案 0 :(得分:0)

你也必须重塑

library(dplyr)
library(tidyr)

data_frame(
  media_id = c(782363, 782379, 1449109, 1449160),
  filename = c("000041f1", "000041f1", "00006c9b", "00006c9b"),
  duration = c(12577, 12570, 530423, 530420) ) %>%
    group_by(filename) %>%
    mutate(sub_group = 1:n()) %>%
    gather(variable, value, -filename, -sub_group) %>%
    unite(new_variable, variable, sub_group) %>%
    spread(new_variable, value) %>%
    mutate(duration.difference = duration_1 - duration_2)

答案 1 :(得分:0)

dplyr之外的另一个选择是使用reshape2的{​​{1}}。它本质上是一个unmelt / pivot功能。

dcast

让R在更大规模上工作是一个不同的挑战,但我相信这是一个相当简单的解决方案。祝你好运。