R:将data.table中某列的字符串替换为另一列的字符串



我有以下数据。

library(data.table)
dt1 <- as.data.table(data.frame(
relative.1 = c("up", "down", "up", "down", "down", 
"up", "up", "up", "down", "down"), 
color.1 = c(
"<span style=     color: red !important; >0.00239377213823793</span>", 
"<span style=     color: red !important; >0.0189475913373258</span>", 
"<span style=     color: red !important; >0.000944874682014027</span>", 
"<span style=     color: red !important; >0.00115563834695583</span>", 
"<span style=     color: red !important; >0.00190146895689528</span>", 
"<span style=     color: red !important; >0.00905363339565874</span>", 
"<span style=     color: red !important; >0.00786719465124788</span>", 
"<span style=     color: red !important; >0.0021806607355806</span>", 
"<span style=     color: black !important; >0.0677967189492317</span>", 
"<span style=     color: black !important; >0.0643565809998716</span>"
), stringsAsFactors = FALSE))

我想替换">"中的数字字符。和";& lt;"与列的对应行中的字符串"相对"。例如,在第一行中,我想替换为"0.00239377213823793";与"up".

请指教。

数据。table包使用一个就地更新操作符:=来允许您高效地更新列。您可以引用data.table范围内的其他列。对字符串进行编辑有多种方法,虽然正则表达式不适合解析HTML,但下面的模式适用于这里的示例。

dt1[, color.1 := stringr::str_replace(
string = color.1, 
pattern = "[0-9.]+", 
replacement = relative.1)]
dt1
# relative.1                                                color.1
#  1:         up     <span style=     color: red !important; >up</span>
#  2:       down   <span style=     color: red !important; >down</span>
#  3:         up     <span style=     color: red !important; >up</span>
#  4:       down   <span style=     color: red !important; >down</span>
#  5:       down   <span style=     color: red !important; >down</span>
#  6:         up     <span style=     color: red !important; >up</span>
#  7:         up     <span style=     color: red !important; >up</span>
#  8:         up     <span style=     color: red !important; >up</span>
#  9:       down <span style=     color: black !important; >down</span>
# 10:       down <span style=     color: black !important; >down</span>
dt1[, color.1 := sub('(?<=>)[0-9]+\.[0-9]+(?=<)', relative.1, color.1, perl = TRUE), by = relative.1]
#     relative.1                                                color.1
#  1:         up     <span style=     color: red !important; >up</span>
#  2:       down   <span style=     color: red !important; >down</span>
#  3:         up     <span style=     color: red !important; >up</span>
#  4:       down   <span style=     color: red !important; >down</span>
#  5:       down   <span style=     color: red !important; >down</span>
#  6:         up     <span style=     color: red !important; >up</span>
#  7:         up     <span style=     color: red !important; >up</span>
#  8:         up     <span style=     color: red !important; >up</span>
#  9:       down <span style=     color: black !important; >down</span>
# 10:       down <span style=     color: black !important; >down</span>

相关内容

最新更新