【问题标题】:R cumulative sum of one variable while another variable tracks "cutoff"R 一个变量的累积总和,而另一个变量跟踪“截止”
【发布时间】:2023-03-17 11:57:01
【问题描述】:

请原谅我的问题很奇怪。这是构建它的最合乎逻辑的方式。真的,我不在乎花。

我最终想做的是找到超过花瓣宽度/花瓣长度的每个“临界值”的鸢尾花萼片长度的总和。

考虑下面的代码

library(tidyverse)
data("iris")       
 iris <- iris %>% 
      mutate(prop_width_length = Petal.Width/Petal.Length)

    prop_width_length <-  as.data.frame(iris$prop_width_length)

    portion = as.data.frame(seq(0,1,0.001))
    cumsum = NULL


    for (i in 1:1001) {
      cumsum[i] = sum(prop_width_length >= portion[i,1])
    }

sigportion <-  cbind(portion, cumsum)

这给了我有多少鸢尾花的宽度/长度比例大于或等于每个“临界值”的累积总和。最后它把它放在一个数据框中,这样我就可以制作一个漂亮的 ggplot。基本上它计算每个“临界值”有多少花。

除了上面的代码之外,我还想将每个虹膜的所有萼片长度相加,其中它们的花瓣宽度/长度比大于或等于存储我的部分变量的每个“临界值”。

类似

sum all the sepal lengths of iris flowers which have petal width/length >= critvalue

【问题讨论】:

  • 这不是你做的吗?仅使用前 5 行 iris 数据,您能否显示您的预期输出应该是什么?
  • 不,我数了数花的数量。以下答案是很好的解决方案。我很接近!

标签: r cumulative-sum


【解决方案1】:

data.table 变得非常简单

library(data.table)
iris<-as.data.table(iris)
iris[,prop_width_length := Petal.Width/Petal.Length]
portion<-as.data.table(seq(from = 0,to = 1,by = 0.001))
cumsum<-vector()
for(i in 1:nrow(portion)){
  cumsum[i]<-iris[prop_width_length >= portion[[1]][i],sum(Sepal.Length)]
}
sigportion<-cbind(portion,cumsum)

希望有帮助!

【讨论】:

    【解决方案2】:

    您可以使用lapply 完成此操作。必须有一种更简洁的方法,但这是我的版本:

    mySeq<-seq(0,1,0.001)
    df<-data.frame(mySeq=mySeq,cumsum=as.numeric(lapply(mySeq,function(X)sum(ifelse(iris$Petal.Width/iris$Petal.Length>=X,1,0)))))
    

    在函数中,我正在检查条件并总结满足的情况

    下面的代码应该给你萼片长度的总和

    dfSepalLengths<-data.frame(mySeq=mySeq,cumsum=as.numeric(lapply(mySeq,function(X)sum(ifelse(iris$Petal.Width/iris$Petal.Length>=X,iris$Sepal.Length,0)))))
    

    您也可以如下修改您的代码以获得相同的结果:

    library(tidyverse)
    data("iris")       
    iris <- iris %>% 
      mutate(prop_width_length = Petal.Width/Petal.Length)
    
    portion = as.data.frame(seq(0,1,0.001))
    cumsum = NULL
    
    
    for (i in 1:1001) {
      cumsum[i] = sum(ifelse(iris$prop_width_length >= portion[i,1],iris$Sepal.Length,0))
    }
    
    sigportion <-  cbind(portion, cumsum)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-18
      • 1970-01-01
      • 2017-09-27
      • 2014-08-15
      相关资源
      最近更新 更多