【问题标题】:how to extract each row of a dataframe and add the parsed strings from another dataframe to a column of the first data frame in R如何提取数据帧的每一行并将解析的字符串从另一个数据帧添加到 R 中第一个数据帧的列
【发布时间】:2014-03-29 09:42:01
【问题描述】:
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

      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

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    我会认为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
    

    splitstackshape

    我的“splitstackshape”包中的concat.split.multiple 可以轻松处理这种事情(尽管它并不总是最快的解决方案)。

    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
    

    如果您想摆脱concat.split.multiple 输出中的NA 值,可以使用complete.cases

    【讨论】:

    • 嗨,很抱歉让您感到困惑...我忘了提一件事,实际上我的 dim df 大约有 5000 列,而 min df 大约有 4 列。
    【解决方案2】:

    您的意思是最后 4 列的 Fax = 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
    

    我在 Words 上应用了 strsplit 并重新制作了您的 min data.frame。之后,合并功能可以很好地将数据框放在一起。

    【讨论】:

    • ya..它将是 6 而不是 4。
    • 嗨,很抱歉让您感到困惑...我忘了提一件事,实际上我的 dim df 大约有 5000 列,而 min df 大约有 4 列。
    • @tanay 很难理解你想要什么。这里的两个答案都解决了您当前的问题,因此您应该接受一个,或者如果您不满意,请更新您的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-25
    • 1970-01-01
    相关资源
    最近更新 更多