【问题标题】:Reducing dataset size by one iteratively in R在 R 中迭代地将数据集大小减小一
【发布时间】:2019-08-05 17:31:58
【问题描述】:

我有一个数据集,我希望在达到特定条件之前一直减 1。我希望将所有数据集单独保存并合并到一个列表中。例如手动我可以这样做:

a<-mtcars[1:nrow(mtcars),]
b<-mtcars[2:nrow(mtcars),]
c<-mtcars[3:nrow(mtcars),]
d<-mtcars[4:nrow(mtcars),]
e<-mtcars[5:nrow(mtcars),]
f<-mtcars[6:nrow(mtcars),]
g<-mtcars[7:nrow(mtcars),]
h<-mtcars[8:nrow(mtcars),]
i<-mtcars[9:nrow(mtcars),]
j<-mtcars[10:nrow(mtcars),]

as.list(a,b,c,d,e,f,g,h,i,j)

假设在第 10 行,满足某些条件,例如某个日期。我怎么能迭代地做到这一点?我尝试了一个 for 循环,但最终只有最后一个数据集作为输出,而不是每个逐渐变小的数据集。

【问题讨论】:

    标签: r for-loop apply lapply sapply


    【解决方案1】:

    你在 for 循环中走在了正确的道路上。如果您只是以创建结果框架的方式返回最后一个,那就错了。

    dataList = list()
    for (i in seq(1, 10)){
        dataList[[i]] = mtcars[i:nrow(mtcars),]
    }
    

    更改为匹配编辑

    【讨论】:

    • 将问题从长度更改为 nrow 以符合我的解释,但仍接受此作为答案。
    【解决方案2】:

    两件事:

    1. 没有理由重复 n:nrow(mtcars),只需传递 -(1:i) 作为行索引。

    2. 要包含条件,您可以使用带有break() 的ifelse。

    例如,这里是 for 循环,条件是它会重复这个循环 7 次:

      mc<-list()
      for(i in 1:nrow(mtcars)) ifelse(i==7,break(),mc[[i]]<-mtcars[-(1:i),])
    

    【讨论】:

    • 如何将条件修改为与数据框相关的内容。例如,如果我想结束进程一次 disp
    • 你所说的“once disp mtcars$disp[i+1]<80
    • 或者,例如,如果您想在 mpg 总和低于 500 时停止,您可以使用 sum(mtcars$mpg[-(1:i)]&lt;500
    • 将其更改为答案,因为它解决了有条件的问题。
    猜你喜欢
    • 1970-01-01
    • 2020-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 2021-09-21
    • 2021-04-20
    • 1970-01-01
    相关资源
    最近更新 更多