R 基于ID将频率表与现有数据帧合并 我所拥有的:

R 基于ID将频率表与现有数据帧合并 我所拥有的:,r,dataframe,R,Dataframe,根据我最初的观察 video_id user_id keyword 1 1 foo 2 1 bar 3 1 baz 4 1 yak 1 2 foo 2 2 bar 3 2 blah 4 2 yak 1 3 foo 2 3

根据我最初的观察

video_id  user_id keyword
1         1       foo
2         1       bar
3         1       baz
4         1       yak
1         2       foo
2         2       bar
3         2       blah
4         2       yak
1         3       foo
2         3       bar
3         3       blah
4         3       yak
…我有一个频率表(称为
选项卡
),它以我想要的格式显示,例如

video_id  foo bar baz yak blah
1         4   0   0   0   0
2         0   4   0   0   0
3         0   0   2   0   2
4         0   0   0   4   0
我希望根据ID列将此表与现有数据框(称为
data
)合并。例如,它还包含另外两列:

video_id  col1  col2
1         123   412
2         652   633
3         749   144
4         1738  1763
我需要的是: 我需要根据视频ID合并频率表和现有数据帧。请注意,它不必排序,因此我不能只
cbind
它们。这就是我需要的结果:

video_id  col1  col2  foo bar baz yak blah
1         123   412   4   0   0   0   0
2         652   633   0   4   0   0   0
3         749   144   0   0   2   0   2
4         1738  1763  0   0   0   4   0
现在,我知道我可以得到这样的数据帧矩阵:

as.data.frame.matrix(table(…))
但是这个矩阵缺少
video\u id
列,这实际上是在我查看表格时显示的。那么,我如何获取仍然包含
video\u id
列或行名称的数据帧呢

我需要
video\u id
列首先出现在数据帧中,然后是原始列,然后是附加的表格数据,如上面的示例所示

我所尝试的:
  • 我知道我可以通过
    rownames(table(…)
    获得表的行名,并且我可以得到我想要的结果

    cbind(data.frame(video_id=rownames(tab)), as.data.frame.matrix(tab))
    
    但这对我来说似乎不够干净

  • 直接与合并

    merge(data, as.data.frame.matrix(tab))
    
    提供所有结果,但
    video\u id
    列位于表格数据和原始数据之间,因此顺序不正确

    • 我所做的:

      data <- read.table(text = "video_id  col1  col2
      1         123   412
      2         652   633
      3         749   144
      4         1738  1763", header = TRUE)
      
      tab <- read.table(text = "video_id  user_id keyword
      1         1       foo
      2         1       bar
      3         1       baz
      4         1       yak
      1         2       foo
      2         2       bar
      3         2       blah
      4         2       yak
      1         3       foo
      2         3       bar
      3         3       blah
      4         3       yak", header = TRUE)
      
      tt <- aggregate(keyword ~ video_id, data = tab, FUN = table)
      mrg <- merge(data, tt)
      mrg
      
        video_id col1 col2 keyword.bar keyword.baz keyword.blah keyword.foo keyword.yak
      1        1  123  412           0           0            0           3           0
      2        2  652  633           3           0            0           0           0
      3        3  749  144           0           1            2           0           0
      4        4 1738 1763           0           0            0           0           3
      

      数据这里有一种方法,包括
      cbind
      match

      数据:

      df1 <- read.table(text="video_id  user_id keyword
      1         1       foo
      2         1       bar
      3         1       baz
      4         1       yak
      1         2       foo
      2         2       bar
      3         2       blah
      4         2       yak
      1         3       foo
      2         3       bar
      3         3       blah
      4         3       yak", header = TRUE)
      
      tab <- table(df1[c("video_id", "keyword")])
      
              keyword
      video_id bar baz blah foo yak
             1   0   0    0   3   0
             2   3   0    0   0   0
             3   0   1    2   0   0
             4   0   0    0   0   3
      
      
      df2 <- read.table(text="video_id  col1  col2
      1         123   412
      2         652   633
      3         749   144
      4         1738  1763", header = TRUE)
      
      结果是:

        video_id col1 col2 bar baz blah foo yak
      1        1  123  412   0   0    0   3   0
      2        2  652  633   3   0    0   0   0
      3        3  749  144   0   1    2   0   0
      4        4 1738 1763   0   0    0   0   3
      

      一旦您将表转换为DATA框架,您可以尝试<代码>合并> /COD>?当我尝试<代码>合并(数据,AS .Data .Fr.Matrix(Tab))< /C> >时,我得到所有的结果,但是ID列在中间——所以首先我得到表格数据,然后是ID列,然后是剩余部分,并强制<代码> by =“VIEOTHOID”。
      在合并返回中,必须将唯一有效的列指定为错误。可以重新排列列<代码>您的.data[,c(2,1,3,4)]例如。另外,如果您想通过两个不唯一的列进行合并,您可以使用
      by.x
      by.y
      。如果列
      video\u id
      相同,我不太明白为什么我需要
      by.x
      by.y
      (尽管表中没有明确包含这样的列)。此时,我将邀请您发布一些示例数据:看见
      tt <- aggregate(keyword ~ video_id, data = tab, FUN = table)
      tt3 <- do.call("cbind", tt)
      merge(data, tt3)
      
      df1 <- read.table(text="video_id  user_id keyword
      1         1       foo
      2         1       bar
      3         1       baz
      4         1       yak
      1         2       foo
      2         2       bar
      3         2       blah
      4         2       yak
      1         3       foo
      2         3       bar
      3         3       blah
      4         3       yak", header = TRUE)
      
      tab <- table(df1[c("video_id", "keyword")])
      
              keyword
      video_id bar baz blah foo yak
             1   0   0    0   3   0
             2   3   0    0   0   0
             3   0   1    2   0   0
             4   0   0    0   0   3
      
      
      df2 <- read.table(text="video_id  col1  col2
      1         123   412
      2         652   633
      3         749   144
      4         1738  1763", header = TRUE)
      
      cbind(df2, tab[match(df2$video_id, rownames(tab)), ])
      
        video_id col1 col2 bar baz blah foo yak
      1        1  123  412   0   0    0   3   0
      2        2  652  633   3   0    0   0   0
      3        3  749  144   0   1    2   0   0
      4        4 1738 1763   0   0    0   0   3