R:将函数应用于数据帧列表时出错

时间:2014-11-08 16:49:47

标签: r

我对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)中的错误:下标超出界限。我当然试图谷歌这个和在这个论坛中搜索,但我只是无法理解我做错了什么。非常感谢帮助,谢谢!

2 个答案:

答案 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是什么,它显然不是123bp1bp2中的任何一个,或lp

<击> 你需要做的是在函数内部定义i,或者在全局中定义它(不推荐,因为首先出现这样的错误),或者将它作为显式传递参数(推荐):

bp_calc <- function(x, i) {
    # stuff
}
lapply(my.list, bp_calc, i = something)

<击>

R试图用i做什么?它正在尝试访问i的元素x,然后访问1的元素3x[[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]