r - 如何取 2 列生成长度为 N 的序列并添加为 R 中的列?
问题描述
我有一个数据框,最小和最大 2 列。我想为每一行生成这些数字的序列。
df <- data.table("ID"=c("A","B","C"),
"mn" = c(1,2,3),
"mx" = c(10,5,10)
)
> df
ID mn mx
1: A 1 10
2: B 2 5
3: C 3 10
我想取这 2 列并为每行生成 4 个序列号
>df
ID | mn | mx | S1 | s2 | S3 | s4
A 1 10 1 4 7 10
B 2 5 2 3 4 5
C 3 10 3 5.33 7.66 10
我可以遍历行并使用 seq(mn, mx, length=N) 但我想将此操作应用于 100 万行,请提出有效的解决方案。
解决方案
另一个使用 which 的矢量化选项data.table
应该更快,而无需逐行遍历:
df[, paste0("s", 1L:4L) := {
d <- (mx - mn) / 3
.(mn, mn + d, mn + 2*d, mx)
}]
概括地说,thelatemail 建议:
N <- 4L
df[, paste0("s", seq(N)) := transpose(Map(`+`, mn,
lapply((mx - mn) / (N-1), `*`, seq(0, N-1))
))]
或者等效但更长的时间,但我认为它会更快:
N <- 4L #assuming N >= 2
d <- df[, (mx - mn) / (N - 1)]
init <- df[["mn"]]
for (n in 1L:N) {
set(df, j=paste0("s", n), value=init + (n-1) * d)
}
推荐阅读
- python - 如何将一列拆分为 csv 文件中的单独列?
- react-native - 定期备份 redux-persist
- powershell - 如何获取 AD 机器列表并有效获取上次登录的人的用户名
- python - Tensorflow:会话图是空的。Python
- haskell - LiftIO 的目的是什么?
- ios - 如何使用 Core Motion 使用 SwiftUI 输出磁力计数据?
- google-maps - 如何从 Flutter 中的 Geocoder 响应中提取城市位置和国家/地区
- python - django手动控制modified-since
- linux - 如何根据这两行的单词总和组合两个相邻的行(递归)
- amazon-web-services - 从 Lambda 跨账户调用 CloudFormation API