如何提取数据帧的每一行,并将解析后的字符串从另一个数据帧添加到R中第一个数据帧的列

时间:2014-03-29 09:42:02

标签: r dataframe

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

2 个答案:

答案 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然后拆分会更有效率。以下是两个需要考虑的选项:

data.table

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

splitstackshape

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