我试图根据“参考”数据框(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
>
有没有人对如何计算值序列的间隔有任何建议?
答案 0 :(得分:0)
尝试:
mapply(myfn, C, D)
# [1] 7 31 12
问题是你的功能不是自然矢量化的。您可以看到,因为您的返回值是输入的sum
,而sum
不是矢量化操作。
除此之外,如果您查看myfn
,当A < c & A >= d
和c
具有多个值时,表达式d
就没有意义。在那里,您要将df
中的每个值与C
和D
向量中的相应值进行比较(首先是第一个值,第二个到第二个等),而不是比较< em> all df
中的值依次为C
和D
中的每个值。
通过使用mapply
,我基本上使用C
和D
作为参数循环遍历您的函数。
幸运的是,在您的情况下,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