R 是否使用另一个数据框作为映射替换数据框中的列?

R 是否使用另一个数据框作为映射替换数据框中的列?,r,R,在我的具体案例中,我有两个数据帧: > a column 1 red apple 2 red car 3 yellow train 4 random 5 random string 6 blue water 7 thing > map x y 1 red color 2 blue color 3 yellow color 4 random other 5 thing oth

在我的具体案例中,我有两个数据帧:

> a
         column
1     red apple
2       red car
3  yellow train
4        random
5 random string
6    blue water
7         thing

> map
       x     y
1    red color
2   blue color
3 yellow color
4 random other
5  thing other
我想要的结果是:

> a
         column
1         color
2         color
3         color
4         other
5         other
6         color
7         other
我知道这篇文章给出了使用合并的例子。但在我的例子中,有一点不同:

  • 我想检查x列的子字符串键是否包含在a的任何“列”中
  • 来自的映射数据是多个->单个映射
  • 我如何写一些能有效地为我做到这一点的东西?实际上,这两个数据帧更大。A为30k行,map为30x2


    编辑:子字符串可以从“列”中的任何位置开始,不一定是第一个单词 已编辑:在匹配时切换顺序

    首先,我们需要清理数据帧,使其与预期字段匹配。所以类似于
    a$column1可复制的示例:

    a <- data.frame(column=c('red apple', 'red car', 'yellow train', 'random', 'random string', 'blue water', 'thing'), stringsAsFactors=F)
    map <- data.frame(x=c('red', 'blue', 'yellow', 'random'), y=c('color', 'color', 'color', 'other'))
    
    请注意,如果您正在对大数据进行基准测试,您可能希望减少复制!你不想坐在那里等上好几年。。。 另外,请注意,最后一行返回“NA”而不是其他,因为字符串“thing”与地图中的任何内容都不匹配

    这是回报

           test replications elapsed relative user.self sys.self user.child sys.child
    1 firstword          100   0.010    1.111         0        0          0         0
    2     regex          100   0.009    1.000         0        0          0         0
    

    因此,对于您的特定示例数据,正则表达式方法的速度更快-但如前所述,这一切都取决于您的特定数据[本示例的本质是数据集很小,所以所有数据都与其他数据一样快],因此您的里程数可能会有所不同。

    您能否提供一个我们可以复制/粘贴的示例?例如,您可以使用
    dput()
    。为什么“thing”会得到输出“other”?它似乎与
    map
    中的任何行都不匹配。这是一个很好的捕获,make edits此操作将只返回与
    map$x
    相同长度的内容,而不是
    a$column
    。此外,它正在进行完全匹配,因此
    red apple
    red
    不匹配。您可以使用pmatch进行匹配。或者您可以使用regex查找“red”(带有附加约束)。@mathematic.coffee,部分匹配的优点,为此进行编辑。。。但是输出的长度将是$column的
    a
    ,因为脚本的内部将包含许多重复。。。因此
    map$y[1,1,1,1,2,1,3,5,23,2,2,3]
    etc@AmitKohli试试看
    match(x,y)
    只返回长度
    x
    ,因此
    map$y[match(x,y)]
    也将是长度
    x
    “^.*\\b(%s)\\b.*$”意味着,我得到的时间与那些完全相同,非常小,即使在切换到微基准之后,它们基本上是相同的(对于
    第一个单词
    ,它们有一点优势)。我认为您需要一个更大的例子,或者这些例子实际上是相同的。我在这里发布了我所看到的:您是对的,regex方法更快,data.table似乎没有太大的改进。@qwer“\b”表示“单词边界”,因此(例如),“red”与“fred”不匹配。“(红色|蓝色|黄色|随机)”表示“匹配红色或蓝色或黄色或随机”。“^.*”和“.*$”捕获字符串开头和结尾的所有其他内容,以便匹配字符串仅替换为匹配字符串本身。
    
           test replications elapsed relative user.self sys.self user.child sys.child
    1 firstword          100   0.010    1.111         0        0          0         0
    2     regex          100   0.009    1.000         0        0          0         0