【问题标题】:Sum object in a column between an interval defined by another dataframe在由另一个数据框定义的间隔之间的列中求和对象
【发布时间】:2014-02-11 18:28:15
【问题描述】:

我正在尝试根据“参考”数据帧 (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
> 

有人对我如何计算值序列的这种间隔有任何建议吗?

【问题讨论】:

  • 今后,请使用“代码”工具({} 按钮)而不是块引用工具来衬托您的代码。
  • 谢谢,我不知道该怎么做。以后我会更加小心的。

标签: r vector dataframe sum intervals


【解决方案1】:

试试:

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

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

除此之外,如果您查看myfn,当cd 具有多个值时,表达式A &lt; c &amp; A &gt;= d 没有意义。在那里,您将df 中的每个值与CD 向量中的相应值进行比较(因此第一个值与第一个、第二个与第二个等),而不是比较 alldf 中的值依次转换为CD 中的每个值。

通过使用mapply,我基本上是在一次循环使用来自CD 的单个值作为参数的函数。

幸运的是,在您的情况下,C,D 的元素数量与df 不同,因此您实际上收到了警告。如果它们的长度相同,您将不会收到警告,并且您会得到一个单一值的答案,而不是您可能正在寻找的三个。

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

【讨论】:

  • 非常感谢 BrodieG,正如您所说,它很有效。非常感谢您解释不工作的原因。现在我明白了这个错误。
【解决方案2】:

另一种方式...

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

【讨论】:

    猜你喜欢
    • 2013-04-26
    • 1970-01-01
    • 2018-09-23
    • 1970-01-01
    • 2021-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-29
    相关资源
    最近更新 更多