跨两个 Dataframe 的plyr ddply

dy1byipe  于 2023-04-27  发布在  其他
关注(0)|答案(1)|浏览(111)

我不确定我是否使用了正确的函数,但我有两个 Dataframe 。我想从df 2中逐个获取序列值并使用一个函数(LCS_score),以将其与df 1中的每个代码进行比较,然后使用某种向量化方法返回DF 2的同一行中的聚合计数值,但是新列,因为真实的数据集非常大。我以前在另一个应用程序中使用plyr的ldply函数迭代列表时取得了一些成功,在这个例子中,我不太确定如何将它设置为有两个 Dataframe 输入。
资料

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循环,我期望df 2有以下输出,序列列是实际的序列字符串,而不是行号。

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

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

laximzn5

laximzn51#

最后,我通过创建一个额外的函数来解决这个问题,这样我就可以多次使用sapply。
功能1

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)
}

功能2

LCS_tally <- function(sequence, code){
  scores <- sapply(code, LCS_score, sequence)
  total <- sum(unlist(scores))
}

产品应用

sequence_scores <- sapply(df2$sequence, LCS_tally, code = df1$code, simplify = FALSE)

输出

sequence_scores
$`B030 D030 E013 A006 A050`
[1] 0

$`B030 D030 E013 A006 E007`
[1] 1

$`B030 D030 E013 A014 A050`
[1] 1

$`B030 D030 E013 A014 E007`
[1] 2

$`C058 B030 E013 A006 A050`
[1] 0

$`C058 B030 E013 A006 E007`
[1] 4

$`C058 B030 E013 A014 A050`
[1] 1

$`C058 B030 E013 A014 E007`
[1] 5

$`C058 B030 D030 E013 A006`
[1] 0

$`C058 B030 D030 E013 A014`
[1] 2

在我看来,还有空间来优化/确认函数正在产生正确的输出。将随着我的沿着而更新。

相关问题