如何在 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
我正在尝试在每 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