按包含另一个字符串的字符串匹配值

爱德华多·波利

我有两个数据框。第一个看起来像这样:

month     Joanne K. Rowling   Samuel L. Jackson
2000/01   1                   0
2000/02   1                   1
2000/03   0                   1
2000/04   0                   0
2000/05   0                   1
2000/06   1                   0

test_1<-data.frame("Month"=c("2000/01","2000/02","2000/03","2000/04","2000/05","2000/06"), “乔安妮·K·罗琳”=c(1,1,0,0,0,1),“塞缪尔·杰克逊”=c(0,1,1,0,1,0))

另一个看起来像这样

Name            Score
Samuel Jackson  67
Joanne Rowling  52

test_2<-data.frame("Name"=c("Samuel Jackson","Joanne Rowling"),"Score"=c(67,52))

我想将它们组合起来以获得以下数据框

month     Joanne K. Rowling   Samuel L. Jackson
2000/01   52                   0
2000/02   52                   67
2000/03   0                    67
2000/04   0                    0
2000/05   0                    67
2000/06   52                   0

其中值 1 替换为 test_2 中的分数。test_1 中的列名可能与 table_2 中的值略有不同,因此不应修复匹配项。我找到了一种方法来做到这一点:

for(i in 1:nrow(test_2)) {
  for(k in 1:ncol(test_1){
    for(l in 1:nrow(test_1)){
      if(grepl(test_2[i,6],as.data.frame(colnames(test_1))[k,1])) {
        if(test_1[l,k]==1){
          test_1[l,k]<-test_2[i,5]
        }
      }
    }
  }
}

但它非常低效,因为我必须将其应用于数据框列表。请尝试编写一种尽可能少循环的有效方法

罗纳克·沙阿

我认为grepl不会直接在这里工作,因为'Joanne Rowling''Joanne K. Rowling'. 您可以使用stringdist::stringdistmatrix来获取匹配项,然后将相应的值相乘。

mat <- stringdist::stringdistmatrix(names(test_1)[-1], test_2$Name)
test_1[-1] <- sweep(test_1[-1], 2, test_2$Score[max.col(-mat)], `*`)
test_1

#    Month Joanne K. Rowling Samuel L. Jackson
#1 2000/01                52                 0
#2 2000/02                52                67
#3 2000/03                 0                67
#4 2000/04                 0                 0
#5 2000/05                 0                67
#6 2000/06                52                 0

要将其应用于多个数据帧,您可以执行以下操作:

lapply(test_1_list, function(x) {
  mat <- stringdist::stringdistmatrix(names(x)[-1], test_2$Name)
  x[-1] <- sweep(x[-1], 2, test2$Score[max.col(-mat)], `*`)
  x
}) -> result
result

test_1_list数据框列表在哪里

数据

test_1<-data.frame("Month"=c("2000/01","2000/02","2000/03","2000/04","2000/05","2000/06"),
                   "Joanne K. Rowling"=c(1,1,0,0,0,1),
                   "Samuel L. Jackson"=c(0,1,1,0,1,0), check.names = FALSE)
test_2<-data.frame("Name"=c("Samuel Jackson","Joanne Rowling"),"Score"=c(67,52))

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

字符串包含另一个字符串

如何测试字符串是否在PHPUnit中包含另一个字符串?

PHP-检查一个字符串是否包含另一个字符串中的任何字符

搜索与另一个字符串元素列表匹配的字符串元素列表

检查一个字符串是否包含Ruby中另一个字符串的所有字符

包含一个字符串但不包含另一个字符串的正则表达式

如何比较两个字符串数组并将匹配值存储在另一个字符串数组中?

检查字符串是否包含另一个字符串的3个字符长的子字符串

如何选择与另一个字符串最匹配的子字符串

我无法计算另一个字符串中的匹配字符串

如果与另一个字符串匹配,如何使JavaScript更改字符串?

如何检查字符串是否包含另一个字符串-Laravel

匹配一个字符串,但如果包含另一个字符串则不匹配

查找包含一个字符串但不包含另一个字符串的文件

perl字符串与另一个字符串完全匹配

检查REBOL字符串是否包含另一个字符串

当一个字符串与另一个字符串匹配时,如何创建条件总和以加数字?

如何检查一个字符串是否与另一个字符串匹配

如何将一个字符串值除以另一个包含数字值的另一个字符串值

匹配另一个字符串中的子字符串

使用 PHP 将一个字符串与另一个字符串匹配

Javascript按另一个字符串拆分字符串并包含用于将其拆分为结果的另一个字符串

检查字符串是否包含另一个字符串

子字符串可以重新排列以匹配另一个字符串

如何根据替换字符将一个字符串的值替换为另一个字符串?

python基于另一个字符串变量创建字符串变量(包含)

测试字符串是否包含另一个字符串作为单个单词

如何在另一个字符串中包含字符串

如何将一个字符串与另一个字符串匹配并为其返回 true?