【问题标题】:R: write a loop code to go through every nth rows and do a function in datatable?R:编写一个循环代码来遍历每第 n 行并在数据表中执行一个函数?
【发布时间】:2018-02-09 19:41:34
【问题描述】:

我想知道如何编写loop code 来遍历每个nth 行并执行function

例如,

1- 我想sort 每两行降序(#1 & #2)(3&#4)
2- 我想为每两行 (#1 & #2)(#3&#4) 和 etc 计算 var1 的 mean

例如,我想根据ID 列在df 中订购every two rows

    library(data.table)
    ID <- c("229-220", "229-27", "229-321", "229-36")
    Var1 <- LETTERS[1:4]
    Var2 <- rnorm(4,4,1)
    df<- data.frame(ID, Var1, Var2)
    setDT(df)
    df
           ID Var1     Var2
1: 229-220    A 4.497850
2:  229-27    B 2.033383
3: 229-321    C 4.701356
4:  229-36    D 3.527209

预期结果:

### for the first question I'd like to get something similar to this:
         ID    Var1    Var2
    1  229-27    B     2.033383 
    2  229-220   A     4.497850
    3  229-36    D     3.527209
    4  229-321   C     4.701356

 ### for the second question I'd like to get something similar to this:
          com              mean
          A-B             4.49785
          C-D             3.527209

我尝试了不同的方法,但都没有用。

请提供答案或提示让我获得帮助,而不是简单地投反对票!

【问题讨论】:

    标签: r loops sorting datatable apply


    【解决方案1】:

    要解决您的问题,您可以通过选择每隔一行并与前一行进行比较来简单地进行操作...简单地说,您使用 seq() 获取偶数行的索引(2、4、6 和依此类推),然后将 ID 或计算均值与前面的行结合起来。

    seq(2, nrow(df), by = 2)
    [1] 2 4
    

    为了解决第 1 部分,您可以应用此策略并根据 ID 对数据表的每个 2 行切片进行排序。

    do.call(rbind, lapply(seq(2, nrow(df), by = 2), (function(i){
      slice <- df[(i-1):i,]
      slice <- slice[order(slice$ID, decreasing = T),]
      rownames(slice) <- NULL
      slice
    })))
    
            ID Var1     Var2
    1:  229-27    B 3.430371
    2: 229-220    A 6.201931
    3:  229-36    D 4.756426
    4: 229-321    C 3.467930
    

    使用相同的方法和 lapply,这解决了以 data.table-wise 方式计算的意思。

    do.call(rbind, lapply(seq(2, nrow(df), by = 2), (function(i){
      data.frame(com = paste(df$Var1[c((i-1):i)], collapse = "-"),
                 mean = mean(df$Var2[((i-1):i)]))
    })))
    
      com     mean
    1 A-B 4.816151
    2 C-D 4.112178
    

    【讨论】:

    • 是的,你做到了,对此我很感激,但恐怕它没有用!
    • 我是这么认为的。您能否详细说明您收到了什么错误消息或出了什么问题,以便我们尝试提供帮助?
    • 您想根据 Var1 进行排序吗?我在答案中添加了这部分,如果你得到你想要的,请告诉我! :-)
    • 不,我想根据 ID 进行排序,基本上我想要 229-27 first229-220 second229-36first 一样的东西其two row sorting229-321 作为`第二`等等。
    • 好的。我根据这个要求进行了编辑。让我知道它是否有效。干杯
    【解决方案2】:

    这是一个选项。我们可以使用dplyr 包。关键是使用mutate(Group = rep(1:(n()/2), each = 2))创建你想要的组。 df2 是您想要的第一个输出。 df3 是您想要的第二个输出。

    library(dplyr)
    
    df2 <- df %>%
      mutate(Group = rep(1:(n()/2), each = 2)) %>%
      arrange(Group, desc(Var1)) %>%
      select(-Group)
    
    df3 <- df %>%
      mutate(Group = rep(1:(n()/2), each = 2)) %>%
      group_by(Group) %>%
      summarise(com = paste(Var1, collapse = "-"),
                mean = mean(Var2)) %>%
      ungroup() %>%
      select(com, mean)
    

    【讨论】:

      猜你喜欢
      • 2018-12-27
      • 1970-01-01
      • 2019-11-16
      • 2012-05-30
      • 2022-08-17
      • 1970-01-01
      • 2022-07-07
      • 1970-01-01
      • 2014-06-29
      相关资源
      最近更新 更多