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
我知道这篇文章给出了使用合并的例子。但在我的例子中,有一点不同:
编辑:子字符串可以从“列”中的任何位置开始,不一定是第一个单词 已编辑:在匹配时切换顺序 首先,我们需要清理数据帧,使其与预期字段匹配。所以类似于
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