gpt4 book ai didi

r - 根据第一列中的值将函数应用于数据框中除第一列之外的所有行和列

转载 作者:行者123 更新时间:2023-12-02 10:56:54 25 4
gpt4 key购买 nike

您好,希望我能简单地解释一下。我知道这可以通过循环来完成,但这将花费很长时间,并且我需要将这种分析作为网页的一部分来完成,因此某种应用函数应该可以更好地工作。

我有 2 个数据框。数据框 A 具有一系列不同的“ anchor ”和每个 anchor 的类别值(这些是来自已执行的 ddply 的加权平均值)。

anchor     ecomax    ecomin     volume     price    runtime
1 9482 0.12981362 0.5714286 0.12981362 0.1324330 1.00000000
2 9488 0.01458662 0.5544864 0.01458662 0.2967270 0.04166667
3 9549 0.09734398 0.5721429 0.09734398 0.1219376 1.00000000
4 9574 0.00902656 0.5505136 0.00902656 0.1455307 0.14652568
5 9575 0.00902656 0.5505136 0.00902656 0.1460919 0.14652568
6 9576 0.07608863 0.5613563 0.07608863 0.1114813 1.00000000

数据框B是相同类别值的更大数据框(暂时忽略名称),但每个 anchor 有多个条目。

  anchor ecomax_max_med ecomin_min_med volume_med price_med run_time_minimum_med
1 9482 0.12981362 0.5714286 0.12981362 0.1120882 1.00000000
2 9482 0.12981362 0.5714286 0.12981362 0.1686777 1.00000000
3 9488 0.01552049 0.5550000 0.01552049 0.2925363 0.04166667
4 9488 0.01292292 0.5535714 0.01292292 0.3041928 0.04166667
5 9549 0.09734398 0.5721429 0.09734398 0.1238916 1.00000000
6 9549 0.09734398 0.5721429 0.09734398 0.1184564 1.00000000

我想根据 B 的匹配 anchor 从其平均值(数据框 A)中减去 B 的类别值;即,B 的前 2 行( anchor 9482)将采用与 A 的第一行( anchor 9482 平均值)的差异,B 的下 2 行( anchor 9488)将采用与 A 的下一行( anchor 9488 平均值)的差异, 等等。

最终结果是新数据帧 C 的每一行/列( anchor 除外)是数据帧 B 中的值与其对应的 anchor 均值(数据帧 A)之间的差值。我希望这是相当简单的;它可以很容易地通过一个很长的循环来完成。我猜这需要“match”或“by”的某种组合,但我不确定,这非常令人沮丧。帮助!

最佳答案

这是一个data.table解决方案。

它的工作原理是通过anchor(设置为键)合并AB。然后它评估我们创建的表达式 e

列表(ecomax_diff = ecomax_max_med - ecomax,ecomin_diff = ecomin_min_med - ecomin,volume_diff = Volume_med - 体积,price_diff = Price_med - 价格,runtime_diff = run_time_minimum_med - 运行时间)

使用maplysprintfparse

解决方案取决于将每个 data.table 的相应列名称传递给 mapply。

library(data.table)
DA <- data.table(A)
DB <- data.table(B)
setkey(DA, 'anchor')
setkey(DB, 'anchor')

.calls <- mapply(sprintf, as.list(names(DA)[-1]),
as.list(names(DB)[-1]), as.list(names(DA)[-1]),
MoreArgs = list(fmt = '%s_diff = %s - %s'))

.e <- parse(text = sprintf('list(%s)', paste(.calls, collapse =', ')))


DA[DB, eval(.e)]
## anchor ecomax_diff ecomin_diff volume_diff price_diff runtime_diff
## 1: 9482 0.00000000 0.0000000 0.00000000 -0.0203448 0
## 2: 9482 0.00000000 0.0000000 0.00000000 0.0362447 0
## 3: 9488 0.00093387 0.0005136 0.00093387 -0.0041907 0
## 4: 9488 -0.00166370 -0.0009150 -0.00166370 0.0074658 0
## 5: 9549 0.00000000 0.0000000 0.00000000 0.0019540 0
## 6: 9549 0.00000000 0.0000000 0.00000000 -0.0034812 0

第二种效率较低但可能更容易遵循的解决方案

 # calculate the difference between the respective columns (merged appropriately
DIFF <- DB[, names(DB)[-1],with = F] - DA[DB][, names(DA)[-1], with = F]
# combine with the anchor column from DB
DC <- cbind(DB[,list(anchor)],DIFF)
# rename with the names from A (otherwise they will have the same as DB
setnames(DC, names(DA))
# It creates the correct output !
DC
## anchor ecomax ecomin volume price runtime
## 1: 9482 0.00000000 0.0000000 0.00000000 -0.0203448 0
## 2: 9482 0.00000000 0.0000000 0.00000000 0.0362447 0
## 3: 9488 0.00093387 0.0005136 0.00093387 -0.0041907 0
## 4: 9488 -0.00166370 -0.0009150 -0.00166370 0.0074658 0
## 5: 9549 0.00000000 0.0000000 0.00000000 0.0019540 0
## 6: 9549 0.00000000 0.0000000 0.00000000 -0.0034812 0
  • 注意:如果 -.data.table 在未来版本中忽略字符列,这可能会变得更加简单

关于r - 根据第一列中的值将函数应用于数据框中除第一列之外的所有行和列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12399337/

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