dim <- data.frame(Max = c(1,2,3), Fax = c(4,5,6))
> dim
Max Fax
1 1 4
2 2 5
3 3 6
min <- data.frame(Num=c(1,2,3), Words = c("ab bc de","ma pa","ka da sa ba"))
> min
Num Words
1 1 ab bc de
2 2 ma pa
3 3 ka da sa ba
我有两个数据帧dim amd min。两个数据框中的行数相同。现在我想在昏暗的数据框中添加另一列(Words),昏暗的数据框看起来像:
> dim
Max Fax Words
1 1 4 ab
2 1 4 bc
3 1 4 de
4 2 5 ma
5 2 5 pa
6 3 6 ka
7 3 6 da
8 3 6 sa
9 3 6 ba
答案 0 :(得分:0)
你的意思是最后4列的传真= 6?如果是这样,这可能不是最优雅的解决方案,但它应该做的工作:
tmp2 <- apply(min, 1, function(x) {
tmp <- unlist(strsplit(as.character(x[2]), " "))
data.frame(Num = rep(x[1], length(tmp)), Words = tmp)})
min <- do.call(rbind, tmp2)
dim <- merge(dim, min, by.x = "Max", by.y = "Num", all = TRUE)
dim
Max Fax Words
1 1 4 ab
2 1 4 bc
3 1 4 de
4 2 5 ma
5 2 5 pa
6 3 6 ka
7 3 6 da
8 3 6 sa
9 3 6 ba
我做了什么我在Word上应用了strsplit并重新制作了你的min data.frame。之后,合并功能可以很好地将数据帧放在一起。
答案 1 :(得分:0)
我认为首先merge
然后拆分会更有效率。以下是两个需要考虑的选项:
library(data.table)
DT <- data.table(merge(dim, min, by.x = "Max", by.y = "Num"), key = "Max,Fax")
DT[, list(unlist(strsplit(as.character(Words), " "))), by = key(DT)]
# Max Fax V1
# 1: 1 4 ab
# 2: 1 4 bc
# 3: 1 4 de
# 4: 2 5 ma
# 5: 2 5 pa
# 6: 3 6 ka
# 7: 3 6 da
# 8: 3 6 sa
# 9: 3 6 ba
concat.split.multiple
来自我的&#34; splitstackshape&#34;包很容易处理这种事情(虽然它并不总是最快的解决方案)。
library(splitstackshape)
concat.split.multiple(merge(dim, min, by.x = "Max", by.y = "Num"),
"Words", " ", "long")
# Max Fax time Words
# 1 1 4 1 ab
# 2 2 5 1 ma
# 3 3 6 1 ka
# 4 1 4 2 bc
# 5 2 5 2 pa
# 6 3 6 2 da
# 7 1 4 3 de
# 8 2 5 3 <NA>
# 9 3 6 3 sa
# 10 1 4 4 <NA>
# 11 2 5 4 <NA>
# 12 3 6 4 ba
如果您想摆脱complete.cases
输出中的NA
值,可以使用concat.split.multiple
。