如何在 R 或 Excel 中每隔 3 行产生一个结果?

How to produce a result at every 3rd row in R or Excel?

我正在尝试在每 3 行出现一次的 D 列中生成值。 D 中的第一个值是 A 中前三个值的总和除以 B 中前三个值的总和。D 中的第二个值应位于第四行,即 A 中第 4-6 行的总和除以通过 B 中第 4-6 行的总和,依此类推。

A B D
1 2 1+3+4/2+2+3
3 2 
4 3 
4 4 4+5+6/4+3+2
5 3
6 2

这是 R 中的一个快速解决方案。

dat <- data.frame(A = c(1,3,4,4,5,6),
                  B = c(2,2,3,4,3,2))
n <- nrow(dat)
L_idx <- 3*c(1:(n/3)) - 2
U_idx <- 3*c(1:(n/3))
D <- rep(NA, n)
for (i in 1:(n/3)) {
  D[L_idx[i]] <- sum(dat$A[L_idx[i]:U_idx[i]])/sum(dat$B[L_idx[i]:U_idx[i]])
}
dat <- data.frame(dat, D)
> dat
  A B        D
1 1 2 1.142857
2 3 2       NA
3 4 3       NA
4 4 4 1.666667
5 5 3       NA
6 6 2       NA

您可以尝试使用 dplyr

library(dplyr)

df <- read.table(text = "
                 A B 
1 2 
3 2 
4 3 
4 4 
5 3
6 2", header = T)
df  %>%
  mutate(k = floor((1:n()-1)/3),
         n = 1:n()) %>%
  group_by(k) %>%
  mutate(D = ifelse(n %% 3 == 1, sum(A)/sum(B), NA)) %>% 
  ungroup %>%
  select(-k, -n)

      A     B     D
  <int> <int> <dbl>
1     1     2  1.14
2     3     2 NA   
3     4     3 NA   
4     4     4  1.67
5     5     3 NA   
6     6     2 NA   

更新

感谢@Jean-ClaudeArbaut

df <- read.table(text = "
                 A B 
1 2 
3 2 
4 3 
4 4 
5 3
6 2
1 'data suppressed'
1 3
'data suppressed' 3", header = T)
df  %>%
  mutate(n = row_number(),
    k = ceiling(n/3),
         ) %>%
  group_by(k) %>%
  mutate(D = ifelse(n %% 3 == 1, sum(as.numeric(A), na.rm = T)/sum(as.numeric(B), na.rm = T), NA)) %>% 
  ungroup %>%
  select(-k, -n)

  A               B                    D
  <chr>           <chr>            <dbl>
1 1               2                1.14 
2 3               2               NA    
3 4               3               NA    
4 4               4                1.67 
5 5               3               NA    
6 6               2               NA    
7 1               data suppressed  0.333
8 1               3               NA    
9 data suppressed 3               NA