我对R比较陌生,在花了一些时间熟悉基本概念之后,我现在正在尝试编写我的第一个函数。我想使用该函数对数据帧列表进行一些简单的计算。我的数据看起来像这样(我有超过100个数据帧,所以这是简化的):
d1 <- data.frame(bp1=c(1,2,3),bp2=c(4,5,6), lp=c(4,5,6))
d2 <- data.frame(bp1=c(3,2,1),bp2=c(6,5,4), lp=c(2,1,6))
my.list <- list(d1, d2)
我想要做的是取10 ^ -1st列并乘以第3列中的值。然后我想根据第1列汇总结果。我的功能如下:
bp_calc <- function(x) {
bp1 <- x[[i]][1]
lp <- x[[i]][3]
10^-lp * lp -> x[[i]]$p_logp
aggregate(x[[i]]$p_logp ~ bp1, data = x, sum) -> result
return(result)
}
要在我的数据上使用该功能,我使用:
lapply(my.list,bp_calc)
然而,这是抛出错误:.subset2(x,i,exact = exact)中的错误:下标超出界限。我当然试图谷歌这个和在这个论坛中搜索,但我只是无法理解我做错了什么。非常感谢帮助,谢谢!
答案 0 :(得分:1)
您可以使用transform
创建新变量p_logp
,并将其用作data
aggregate
bp_calc <- function(x) {
aggregate(p_logp~bp1, transform(x, p_logp=10^-lp*lp), sum)
}
lapply(my.list, bp_calc)
答案 1 :(得分:0)
subscript out of bounds
表示您正在尝试访问不存在的列表元素。例如:
l <- as.list(letters[1:3])
l[4] # returns list(NULL)
l[[4]] # error
那为什么会这样呢?仔细查看您的代码。 lapply(my.list, bp_calc)
提取my.list
的每个元素,并将其传递给bp_calc
的第一个参数。在这种情况下,每个列表元素都是一个数据框,i
永远不会在此过程中的任何位置定义。
因此,R在定义i
的环境中搜索名为bp_calc
的变量。在这种情况下,要么找到i
,要么找不到并返回错误。这里R发现在其他地方定义了i
,否则就会说object 'i' not found
。无论i
是什么,它显然不是1
,2
,3
,bp1
,bp2
中的任何一个,或lp
。
<击>
你需要做的是在函数内部定义i
,或者在全局中定义它(不推荐,因为首先出现这样的错误),或者将它作为显式传递参数(推荐):
bp_calc <- function(x, i) {
# stuff
}
lapply(my.list, bp_calc, i = something)
击> <击> 撞击>
R试图用i
做什么?它正在尝试访问i
的元素x
,然后访问1
的元素3
或x[[i]]
。请注意,x
一个数据框,而非数据框列表,因为lapply
在 {{1}之前将my.list
分开}} 叫做。您似乎在想bp_calc
会访问&#34;当前&#34; list元素,但实际上x[[i]]
本身是当前的列表元素,因此x
实际上是当前元素{{1}的&#34; i元素}}&#34。所以x[[i]]
是&#34;当前元素my.list
&#34;的第i个元素的第三个元素。
你想要的是这个:
x[[i]][3]