gpt4 book ai didi

r - 在 RStudio 中按条件分组

转载 作者:行者123 更新时间:2023-12-04 10:22:00 26 4
gpt4 key购买 nike

大家早上好,我有一个包含多个变量的 csv 文件(df2.csv),如下图所示(仅作为示例):

CLASSE  Variables   Terms   Number    
1 DAT_1 20160701q 5
1 DAT_1 20160802q 2
1 DAT_1 20160901q 1
1 DAT_2 20161001q 1
1 DAT_2 20161201q 2
1 DAT_2 20170301q 3
2 DAT_1 20161001q 1
2 DAT_1 20161201q 2
2 DAT_1 20170301q 1

我希望对于每个类(在这种情况下为 1 或 2),对于每个不同的日期变量,如果个体数小于 3,则将个体与下一个日期分组。如果我有超过 3 个人的时期,在这种情况下,我想要一个像“20160701q-20160901q”这样的日期,而不是分别使用 20160701q 和 20160901q。在这种情况下,我们将两个或更多日期分组以获得超过 3 个人的时间段,如果类(class)的下一个日期少于 3 个人,我们也会将此日期与之前的时间段分组。
我从这段代码开始
for (n in df2$CLASSE){
for (k in df2$Variables){
for (i in 1:nrow(df2)){
if (df2$Number[i]<3){
rempl_date=paste(df2$Terms[i],df2$Terms[i+1], sep="-")
df2$Terms[i]<-rempl_date
next
}
}
}
}

但它不起作用,我想在分组后拥有这个:
CLASSE  Variables   Terms              Number
1 DAT_1 20160701q 5
1 DAT_1 20160802q-20160901q 3
1 DAT_2 20161001q-20161201q 3
1 DAT_2 20170301q 3
2 DAT_1 20161001q-20170301q 4

如果你能帮助我,我不知道我必须改变什么,我希望我很清楚。提前致谢

最佳答案

这是一个基本的R解决方案:

  • 定义用于分组的自定义函数
  • f <- function(v, th = 3) {
    k <- 1
    r <- c()
    repeat {
    if (length(v)==0) break
    ind<-seq(head(which(cumsum(v)>=th),1))
    if (sum(v)<2*th) {
    r <- c(r,rep(k,length(v)))
    v <- c()
    } else {
    r <- c(r,rep(k,length(ind)))
    v <- v[-ind]
    }
    k <- k+1
    }
    r
    }
  • 然后使用 aggregate + ave

  • dfout <- subset(aggregate(Terms~.,
    within(within(df,grp <- ave(Number,Classe, Variables, FUN = f)),
    Number <- ave(Number,Classe,Variables,grp,FUN = sum)),
    c),
    select = -grp)

  • 格式化 dfout使用 order 到所需的样式
  • dfout <- dfout[order(dfout$Classe,dfout$Variables),]

    输出
    > dfout
    Classe Variables Number Terms
    3 1 DAT_1 5 20160701q
    4 1 DAT_1 3 20160802q, 20160901q
    1 1 DAT_2 3 20161001q, 20161201q
    5 1 DAT_2 3 20170301q
    2 2 DAT_1 4 20161001q, 20161201q, 20170301q

    数据
    df <- structure(list(Classe = c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L), 
    Variables = c("DAT_1", "DAT_1", "DAT_1", "DAT_2", "DAT_2",
    "DAT_2", "DAT_1", "DAT_1", "DAT_1"), Terms = c("20160701q",
    "20160802q", "20160901q", "20161001q", "20161201q", "20170301q",
    "20161001q", "20161201q", "20170301q"), Number = c(5L, 2L,
    1L, 1L, 2L, 3L, 1L, 2L, 1L)), class = "data.frame", row.names = c(NA,
    -9L))

    更新
    如果要连接 Terms中的内容,试试下面的代码
    dfout <- subset(aggregate(Terms~.,
    within(within(df,grp <- ave(Number,Classe, Variables, FUN = f)),
    Number <- ave(Number,Classe,Variables,grp,FUN = sum)),
    FUN = function(v) ifelse(length(v)==1,v,paste0(c(v[1],v[length(v)]),collapse = "-"))),
    select = -grp)

    dfout <- dfout[order(dfout$Classe,dfout$Variables),]

    以至于
    > dfout
    Classe Variables Number Terms
    3 1 DAT_1 5 20160701q
    4 1 DAT_1 3 20160802q-20160901q
    1 1 DAT_2 3 20161001q-20161201q
    5 1 DAT_2 3 20170301q
    2 2 DAT_1 4 20161001q-20170301q

    关于r - 在 RStudio 中按条件分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60811076/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com