gpt4 book ai didi

从 sapply/lapply 返回多个值

转载 作者:行者123 更新时间:2023-12-04 13:23:33 28 4
gpt4 key购买 nike

我是 R 的新手,并试图用 apply 系列的函数替换一些 for 循环。
我仍然不完全理解它们是如何工作的,但我设法生成了一段工作代码:

#create some input data
tech<-data.frame(cbind(c("p1","p2","p3","p4"),c(15,15,15,100),c(10,8,18,100)))
colnames(tech)=c("id","capacity.el","capacity.th")
tech$capacity.el<-as.numeric(tech$capacity.el)
tech$capacity.th<-as.numeric(tech$capacity.th)

heat<-data.frame(cbind(c(2,12,6,20,32,21,25,16,34,0),c(31,18,3,27,30,31,18,4,24,7),c(2,12,6,20,32,21,25,16,34,0),c(31,18,3,27,30,31,18,4,24,7)))
colnames(heat)=c("p1","p2","p3","p4")

> tech
id capacity.el capacity.th
1 p1 2 1
2 p2 2 4
3 p3 2 3
4 p4 1 2


> heat
p1 p2 p3 p4
1 2 31 2 31
2 12 18 12 18
3 6 3 6 3
4 20 27 20 27
5 32 30 32 30
6 21 31 21 31
7 25 18 25 18
8 16 4 16 4
9 34 24 34 24
10 0 7 0 7

#the result should be a matrix/list
pel=matrix(,nrow=nrow(heat),ncol=ncol(heat))
epr=matrix(,nrow=nrow(heat),ncol=ncol(heat))
result<-list()

#main code
result<-sapply(colnames(heat),function(x) {
a<-tech$capacity.th[match(x,tech$id)]
b<-tech$capacity.el[match(x,tech$id)]
sapply(heat[,x],function(y) {
pel<-a*y
return(pel)
})

})

这个想法是通过“热”数据框的列“循环”并执行一些计算
来自“热”数据框的值。出于这个原因,我使用第一个 sapply 函数来获得相应的
技术表中热表中每种植物的特征。然后第二个 sapply 执行
计算。输出“结果”正是我想要的。

现在我想计算“热”(pel 和 epr)中每一行的值。
但我不知道如何从 sapply 函数中提取这些值。
我尝试了以下列表,但这会将值提取为一个包含 20 行的大矩阵。
完美的结果类似于一个包含两个矩阵或 data.frame 对象的列表,每个对象有 10 行和 4 列
与 pel/epr 值。
result<-sapply(colnames(heat),function(x) {
a<-tech$capacity.th[match(x,tech$id)]
b<-tech$capacity.el[match(x,tech$id)]
sapply(heat[,x],function(y) {
pel<-a*y
epr<-b*y
})
new<-list(pel,epr)
return(new)
})

我将不胜感激任何帮助或评论。

最佳答案

建议你先整理一下资料。 see the tidyr package for more information

然后合并两个数据框,不需要任何循环或 *apply 函数。您只需在这个新数据框中进行计算,例如使用 dplyr 包:

library(tidyr)
library(dplyr)

heat %>%
gather(id, value) %>%
left_join(tech, by="id") %>%
mutate(a = value * capacity.el,
b = value * capacity.th)

关于从 sapply/lapply 返回多个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31471387/

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