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

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

提问人:merry123 提问时间:5/31/2022 最后编辑:merry123 更新时间:5/31/2022 访问量:61

问:

我正在尝试在每 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 Excel 数据操作

评论


答:

1赞 pineapple 5/31/2022 #1

这是 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

评论

0赞 Community 5/31/2022
您的答案可以通过其他支持信息进行改进。请编辑以添加更多详细信息,例如引文或文档,以便其他人可以确认您的答案是正确的。您可以在帮助中心找到有关如何写出好答案的更多信息。
1赞 Park 5/31/2022 #2

您可以尝试使用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    

评论

1赞 5/31/2022
这确实是一个小细节,但我会写.mutate(n = row_number(), k = ceiling(n / 3))
0赞 Park 5/31/2022
@Jean-ClaudeArbaut 这就是我一直在寻找的。多谢。总是忘记事情,使用似乎好多了!祝您有美好的一天:D。row_numberceiling
0赞 merry123 5/31/2022
谢谢!如何编码以使程序忽略非数字值?对于 A 和 B 中的某些值,存在“数据抑制”。
0赞 Park 5/31/2022
@merry123我更新了我的代码。它可能会打印一些警告,但您可以忽略它们。