r - 使用 reshape 查找配对事件

标签 r reshape reshape2

我有一个用户和他们在特定时间购买的元素的列表,我想从原始数据中生成这些对的列表。虽然我可以并且可能会编写一个小的 Python 脚本来执行此操作,但我有一种烦人的感觉,即 reshape(或更可能是 reshape2)包可以在几行内完成。

在代码中,我希望将下面的 df 数据框转换为 resdf 数据框:

df <- data.frame(user=c("u1","u2","u1","u3","u2","u4","u5","u4"),
                 item=c("i1","i1","i2","i3","i2","i3","i3","i4"),
                 time=c(1,1,2,3,4,4,5,6))
> df
  user item time
1   u1   i1    1
2   u2   i1    1
3   u1   i2    2
4   u3   i3    3
5   u2   i2    4
6   u4   i3    4
7   u5   i3    5
8   u4   i4    6
> 

### some reshape code here

resdf <- data.frame(user=c("u1","u2","u4"),
                    item1=c("i1","i1","i3"),
                    item2=c("i2","i2","i4"),
                    time=c(1,1,4),
                    delt=c(1,3,2))
> pdf
  user item1 item2 time delt
1   u1    i1    i2    1    1
2   u2    i1    i2    1    3
3   u4    i3    i4    4    2

是否有任何 reshape 向导可以帮助我解决这个问题?

最佳答案

如果您将具有重复 user 值的行合并回没有重复值的行,您将获得所需的信息,然后稍作按摩即可获得所需的排列:

> merge(df[!duplicated(df$user), ], df[duplicated(df$user), ], by="user")
  user item.x time.x item.y time.y
1   u1     i1      1     i2      2
2   u2     i1      1     i2      4
3   u4     i3      4     i4      6
> inter <- merge(df[!duplicated(df$user), ], df[duplicated(df$user), ], by="user")
> inter$delt <- inter$time.y-inter$time.x
> inter[ , c(1,2,4,3,6)]
  user item.x item.y time.x delt
1   u1     i1     i2      1    1
2   u2     i1     i2      1    3
3   u4     i3     i4      4    2

关于r - 使用 reshape 查找配对事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28388702/

相关文章:

读取文件列表,应用函数并用同名重写

R:自动复制大量数据

r - 如何有效地 reshape 我的 data.table

r - 熔化数据框并将列中的值粘贴在一起

r - 使dcast中的drop参数仅查看公式的RHS

r - 基于 TRUE/FALSE 变量列的箱线图

r - 循环遍历 data.table 列并通过变量索引引用创建多个列

R : Odd Behavior with Width On Layout

r - 这种从长到宽的 reshape 我做错了什么?

r - 我可以在 CentOS 上安装 `caret` 吗?