gpt4 book ai didi

r - 使用 R 中 data.frame 的列从转换矩阵中提取值

转载 作者:行者123 更新时间:2023-12-02 07:37:42 25 4
gpt4 key购买 nike

我有一个转换矩阵,其中包含从一种状态到另一种状态的成本,例如

cost <- data.frame( a=c("aa","ab"),b=c("ba","bb"))

(假设字符串“aa”是从a移动到a的代价)

我有一个 data.frame,状态为:

transitions <- data.frame( from=c("a","a","b"), to=c("a","b","b") )

我希望能够为转换添加一列,其中包含每次转换的成本,所以它最终是:

  from to cost
1 a a aa
2 a b ab
3 b b bb

我确信有一种 R 风格的方法可以做到这一点。我最终使用了一个 for 循环:

n <- dim(data)[1]
v <- vector("numeric",n)
for( i in 1:n )
{
z<-data[i,c(col1,col2),with=FALSE]
za <- z[[col1]]
zb <- z[[col2]]
v[i] <- dist[za,zb]
}
data <- cbind(data,d=v)
names(data)[dim(data)[2]] <- colName
data

但这感觉非常丑陋,而且速度非常慢 - 在 2M 行 data.frame 上大约需要 20 分钟(并且计算同一个表的元素之间的距离的操作不到第二)。

是否有一个简单、快速的一两行命令可以让我得到上面的成本列?

最佳答案

更新:考虑已知状态

data.table 解决方案:

require(utils)
require(data.table)

## Data generation
N <- 2e6
set.seed(1)
states <- c("a","b")
cost <- data.frame(a=c("aa","ab"),b=c("ba","bb"))
transitions <- data.frame(from=sample(states, N, replace=T),
to=sample(states, N, replace=T))

## Expanded cost matrix construction
f <- expand.grid(states, states)
f <- f[order(f$Var1, f$Var2),]
f$cost <- unlist(cost)

## Prepare data.table
dt <- data.table(transitions)
setkey(dt, from, to)

## Routine itself
dt[,cost:=as.character("")] # You don't need this line if cost is numeric
apply(f, 1, function(x) dt[J(x[1],x[2]),cost:=x[3]])

transitions 中有 2M 行,大约需要 0.3 秒才能继续。

关于r - 使用 R 中 data.frame 的列从转换矩阵中提取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14694030/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com