在另一个数据帧定义的间隔之间的列中汇总对象

时间:2014-01-21 22:27:01

标签: r vector dataframe sum intervals

我试图根据“参考”数据框(df)中另一列(A)上两个值之间的间隔来获取列(B)的值之和:

A <- seq(1:10)
B <- c(4,3,5,7,5,7,4,7,3,7)
df <- data.frame(A,B)

我找到了两种方法:

y <- sum(subset(df, A < 3 & A >= 1, select = "B"))

> y
[1] 7

z <- with(df,sum(df[A<3 & A>=1,"B"]))
> z
[1] 7

但是,我想基于存储在另一个数据帧上的两个值向量

来做到这一点
C <- c(3,7,7)
D <- c(1,1,5)
df2 <- data.frame(C,D)

获取每对C和D值的y值列。

我创建了一个函数:

myfn <- function(c,d) {
    y <-sum(subset(df, A < c & A >= d, select = "B"))
    return(y)
}

适用于数字

myfn(3,1)
[1] 7

但不是矢量。

myfn(c=C,d=D)
[1] 19

Warning messages:
1: In A < a :
  longer object length is not a multiple of shorter object length
2: In A >= b :
  longer object length is not a multiple of shorter object length
> myfn(df2$C,df2$D)

[1] 19
Warning messages:
1: In A < a :
  longer object length is not a multiple of shorter object length
2: In A >= b :
  longer object length is not a multiple of shorter object length
> 

有没有人对如何计算值序列的间隔有任何建议?

2 个答案:

答案 0 :(得分:0)

尝试:

mapply(myfn, C, D)
# [1]  7 31 12

问题是你的功能不是自然矢量化的。您可以看到,因为您的返回值是输入的sum,而sum不是矢量化操作。

除此之外,如果您查看myfn,当A < c & A >= dc具有多个值时,表达式d就没有意义。在那里,您要将df中的每个值与CD向量中的相应值进行比较(首先是第一个值,第二个到第二个等),而不是比较< em> all df中的值依次为CD中的每个值。

通过使用mapply,我基本上使用CD作为参数循环遍历您的函数。

幸运的是,在您的情况下,C,D的元素数量不同于df,因此您实际上收到了警告。如果它们的长度相同,你就不会得到警告,你会得到一个单一的价值答案,而不是你想要的三个答案。

有更好的方法可以做到这一点,但mapply方法在这里非常简单,并且几乎与您的代码一起使用。

答案 1 :(得分:0)

另一种方式......

is.between <- function(x,vec){  
  return(x>=min(vec) & x<max(vec))
}

apply(df2,1,function(x){sum(df[is.between(df$A,x),]$B)})
# [1]  7 31 12