我想将列表元素按组添加到列中。下面是一个可重现的例子。你知道如何实现吗?
library(data.table)
a <- c("A","A","A","A","B","B","C","C","C","D")
b <- seq(1,10)
dt <- data.table(a,b)
list <- c(15,10,9,120)
dt <- data.table(a,b, c(15,15,15,15,10,10,9,9,9,120))
View(dt)
最佳答案
使用rleid
:
dt[,new:=list[rleid(a)]][]
a b V3 new
<char> <int> <num> <num>
1: A 1 15 15
2: A 2 15 15
3: A 3 15 15
4: A 4 15 15
5: B 5 10 10
6: B 6 10 10
7: C 7 9 9
8: C 8 9 9
9: C 9 9 9
10: D 10 120 120
注意list
是保留关键字,尽量不要将其作为变量使用,以免混淆。
性能比较:
microbenchmark::microbenchmark(dt[, new := list[match(a, unique(a))]],dt[,new:=l[rleid(a)]],dt[,new:=l[.GRP],a],dt[, c := rep(list, rle(dt$a)$l)])
Unit: microseconds
expr min lq mean median uq max neval
dt[, `:=`(new, list[match(a, unique(a))])] 186.0 200.65 269.513 223.90 298.15 700.3 100
dt[, `:=`(new, l[rleid(a)])] 184.9 202.00 248.979 221.85 267.50 650.4 100
dt[, `:=`(new, l[.GRP]), a] 347.4 365.70 466.369 396.35 540.40 1186.4 100
dt[, `:=`(c, rep(list, rle(dt$a)$l))] 204.8 223.85 300.685 257.50 326.95 903.5 100
https://stackoverflow.com/questions/71380464/
相关文章:
node.js - 在 Vue JS 项目上运行 npm run server 时出现错误
azure-functions - VS2022 无法创建 Azure Functions 项目
python - 从现有数据框中列的子字符串创建新的 Pyspark 数据框
reactjs - 如何将主页的页眉和页脚与 react 中的管理页面中的显示分开
ruby-on-rails - 安装带有 native 扩展 Gem::Ext::BuildErro
javascript - React.js,列表中的每个 child 都应该有一个唯一的 "key"