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