plyr ddply 跨两个数据帧

问题描述 投票:0回答:0

不确定我是否使用了正确的功能,但我有两个数据框。我想从 df2 中一个一个地获取序列值,并在其上使用一个函数(LCS_score)将其与 df1 中的每个代码进行比较,然后在 df2 的同一行中返回一个聚合计数值,但使用某种类型的新列矢量化方法,因为真实数据集非常大。我之前在另一个应用程序中使用 plyr 的 ldply 函数迭代列表取得了一些成功。 在这种情况下,我不太确定如何将其设置为具有两个数据框输入。

数据

df1 <- structure(list(code = c("E050 H055 C058 K052 O050 E007", "E051 D052 K053 X050 H055 F054 E013 C057 O050 B030 H056 J053 C058 D030 Q078 Q076 A014 F030 F036 E030 C055 X030 M050 Q006 E007", 
                                "E050 F030 F036 B030 H058 E051 J032 J050 E013 E005 K052 H056 A014 K053 A051 D052 E030 E007 Q072", 
                                "J055 J050 Q006 Q076 Q074 J053 H051 H058 H056 E051 Q077 Q079 E030 D052 A050 Q072 Q003 E050 C058 B030 F030 A014 E007 A010", 
                                "B030 F054 E050 X030 Q006 A050 C058 E007 E051 H058 Q078 F030 J050 K053 D030", 
                                "D030 D052 E051 D051 C058 C055 H058 K053 E050 J054 A039 B030 E007", 
                                "A006 E030 Q076 X001 Q010 Q006 A014 Q072 E007 E051 A050 J032 A051 E050 B030 A010 D052 H056 H058 Q003 E013", 
                                "E050 H056 A050 C058 E013 Q078 E051 J055 D030 A030 D052 D051 K053 E030 E007 Q076", 
                                "J050 E050 H058 H056 C058 A050 D052 E051 Q006 D030 B030 E030 Q003 X030 Q072 Q008", 
                                "D052 E030 E051 J053 E013 H056 L050 D030 H030 C058 O030 F030 F052 E050 F036 D003 E007"
), id = 1:10), row.names = c(NA, -10L), class = c("tbl_df", "tbl", 
                                                  "data.frame"))

df2 <- structure(list(sequence = c("B030 D030 E013 A006 A050", "B030 D030 E013 A006 E007", 
                                    "B030 D030 E013 A014 A050", "B030 D030 E013 A014 E007", "C058 B030 E013 A006 A050", 
                                    "C058 B030 E013 A006 E007", "C058 B030 E013 A014 A050", "C058 B030 E013 A014 E007", 
                                    "C058 B030 D030 E013 A006", "C058 B030 D030 E013 A014")), class = c("tbl_df", 
                                                                                                        "tbl", "data.frame"), row.names = c(NA, -10L))

功能

LCS_score <- function(code, sequence){
  seq_str <- unlist(strsplit(sequence, " "))
  code_str <- unlist(strsplit(code, " "))
  code_subset <- code_str[code_str %in% seq_str]
  sequence_subset <- seq_str[seq_str %in% code_str]
  overlap <- sequence_subset == code_subset
  if(length(overlap) == 0){
    score <- 0
  } 
  else{
    score <- sum(overlap) + 1
  }
  if(score/length(seq_str) > 0.79){
    count <- 1
  } else{
    count <- 0
  }
  return(count)
}

我不确定该函数是否可以在矢量化方法中工作。我已经用单独的输入(例如单个代码和单个序列)对其进行了测试,并且在这种情况下它可以工作。 基于为该数据集组合一个 for 循环,我期望 df2 具有以下输出,其中序列列是实际序列字符串而不是行号。

| Sequence | Count |
| -------- | ----- |
|        1 | 0 |
|        2 | 1 |
|        3 | 1 |
|        4 | 2 |
|        5 | 0|
|        6 | 4|
|        7 | 1|
|        8 | 5|
|        9 | 0|
|       10 | 2|

感谢您的任何意见/建议/解决方案!

r apply plyr
© www.soinside.com 2019 - 2024. All rights reserved.