Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 相互合并列表中的数据帧 我需要的是:_R_Merge_Dataframe_Plyr - Fatal编程技术网

R 相互合并列表中的数据帧 我需要的是:

R 相互合并列表中的数据帧 我需要的是:,r,merge,dataframe,plyr,R,Merge,Dataframe,Plyr,我有一个包含以下列的巨大数据框(还有一些列,但这些并不重要)。下面是一个例子: user_id video_id group_id x y 1 1 0 0 39 108 2 1 0 0 39 108 3 1 10 0 135 180 4 2 0 0 20 123 当然,用户、视频和组ID都是

我有一个包含以下列的巨大数据框(还有一些列,但这些并不重要)。下面是一个例子:

    user_id video_id group_id    x   y
1         1        0        0   39 108
2         1        0        0   39 108
3         1       10        0  135 180
4         2        0        0   20 123
当然,用户、视频和组ID都是因素。例如,有20个视频,但每个视频都有针对每个用户和组的若干“观察”

我想将此数据帧转换为以下格式,其中用户的数量与
x.N
y.N
的数量相同(
N

因此,对于视频
0
,来自用户1的x和y值分别位于
x.1
y.1
列中。对于用户2,它们的值在
x.2
y.2
等列中

我所尝试的: 我为自己制作了一个数据帧列表,这些数据帧完全由每个
video\u id
的所有
x,y
观测值组成:

summaryList = dlply(allData, .(user_id), function(x) unique(x[c("video_id","x","y")]) )
这就是它看起来的样子:

List of 15
 $ 1 :'data.frame': 20 obs. of  3 variables:
  ..$ video_id: Factor w/ 20 levels "0","1","2","3",..: 1 11 8 5 12 9 20 13 7 10 ...
  ..$ x       : int [1:20] 39 135 86 122 28 167 203 433 549 490 ...
  ..$ y       : int [1:20] 108 180 164 103 187 128 185 355 360 368 ...
 $ 2 :'data.frame': 20 obs. of  3 variables:
  ..$ video_id: Factor w/ 20 levels "0","1","2","3",..: 2 14 15 4 20 6 19 3 13 18 ...
  ..$ x       : int [1:20] 128 688 435 218 528 362 299 134 83 417 ...
  ..$ y       : int [1:20] 165 117 135 179 96 328 332 563 623 476 ...
我被困的地方: 剩下要做的是:

  • 根据
    video\u id
    摘要列表中的每个数据帧相互合并。我找不到访问列表中实际数据帧的好方法,它们是
    summaryList[1]$`1`
    summaryList[2]$`2`
    ,等等

    @詹姆斯找到了一个局部解决方案:

    Reduce(function(x,y) merge(x,y,by="video_id"),summaryList)
    
  • 确保列名在用户ID之后重命名,并且不保持原样。现在我的
    summaryList
    不包含任何关于用户ID的信息,并且
    Reduce
    的输出有重复的列名,如
    x.x y.x x x.y.x y.x
    等等


我该怎么做呢?或者有没有比我现在所做的更容易得到结果的方法?

我仍然有些困惑。然而,我想你只是想
融化
dcast

library(reshape2)
d <- melt(allData,id.vars=c("user_id","video_id"), measure.vars=c("x","y"))
dcast(d,video_id~user_id+variable,value.var="value",fun.aggregate=mean)

Reduce
实现了以下目的:

reducedData <- Reduce(function(x,y) merge(x,y,by="video_id"),summaryList)
结果是:

   video_id  x.1 y.1  x.2 y.2  x.3 y.3  x.4 y.4  x.5 y.5  x.6 y.6  x.7 y.7  x.8
1         0   39 108  899 132   61 357  149 298 1105 415  148 208  442 200  210
2         1 1125  70  128 165 1151 390  171 587  623 623   80 643  866 310  994

你能提供你的数据的子集吗?我在想
Reduce(函数(x,y)merge(x,y,by=“video_id”),summaryList)
可能会做一些简单的事情,你可以提供一个输入data.frame和预期输出的(简化)示例吗?“我很难理解你想做什么。”罗兰我补充了一个小例子。这里只是以防万一。@James这几乎有效,只有列是
video\u id x.x y.x x.y y.y x.x y.x y.x
等,所以不是以用户id命名的。@slhck尝试使用
names(reducedData)[-1]我不得不去掉一些exta列,请查看对您文章的编辑,但这同样有效,谢谢!我对
reformate
有点缺乏经验,因此您能否解释一下
dcast
在这里做了什么,或者为什么它首先创建列?
dcast
只是从长格式(最常用于统计软件)转换为宽格式(深受Excel人员的喜爱)。公式定义哪些变量成为列标题
melt
是逆变换。
reducedData <- Reduce(function(x,y) merge(x,y,by="video_id"),summaryList)
names(reducedData)[-1] <- do.call(function(...) paste(...,sep="."),expand.grid(letters[24:25],names(summaryList)))
   video_id  x.1 y.1  x.2 y.2  x.3 y.3  x.4 y.4  x.5 y.5  x.6 y.6  x.7 y.7  x.8
1         0   39 108  899 132   61 357  149 298 1105 415  148 208  442 200  210
2         1 1125  70  128 165 1151 390  171 587  623 623   80 643  866 310  994