1

我有的:

根据我最初的观察......</p>

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

…我有一个频率表(称为tab),它以我想要的确切格式显示,例如

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

我想data根据 ID 列将此表与现有数据框(称为 )合并。因此,例如,它还包含另外两列:

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_id列,当我只是查看表格时,它实际上是显示的。那么,我该如何获取仍然包含video_id列或行名称的数据框呢?

我需要video_id列首先出现在数据框中,然后是原始列,然后是附加的表格数据,如上面的示例所示。

我试过的:

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

    cbind(data.frame(video_id=rownames(tab)), as.data.frame.matrix(tab))
    

    但这对我来说似乎不够干净(足够)。

  • 直接合并

    merge(data, as.data.frame.matrix(tab))
    

    给了我所有的结果,但是video_id列在表格数据和原始数据之间,所以顺序不正确。

4

2 回答 2

1

我做了什么:

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

现在我们有了“奇怪”的列名。如果你不能忍受,这里有一个“黑客”。

tmp <- data.frame(mrg$keyword)
mrg$keyword <- NULL
mrg <- cbind(mrg, tmp)

  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

编辑

这是另一种方式:

tt2 <- tapply(X = tab$keyword, INDEX = tab$video_id, FUN = table, simplify = FALSE)
video_ajdi <- factor(names(tt2))
tt2 <- cbind(video_id = video_ajdi, do.call("rbind", tt2))
mrg <- merge(data, tt2)
mrg

  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

编辑2

还有一个:

tt <- aggregate(keyword ~ video_id, data = tab, FUN = table)
tt3 <- do.call("cbind", tt)
merge(data, tt3)
于 2012-12-23T12:11:42.503 回答
1

这是一种方法,包括cbindand 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)

这是解决方案:

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
于 2012-12-23T12:21:50.320 回答