r-将两行相加,然后除以一行



所以我有一个数据集。我需要每隔一行加一次,然后除以第二行。第2行除以(第1行+第2行(

1   10779
2   911
3   13897
4   2780
5   13552
6   1112
7   15352
8   2036
9   11779
10  790

因此,对于这些数据,我需要[Row 2/(Row 1+Row 2(]So(911/(10779+911((和[Row 4/(Row 3+Row 4]等。我接近使用tidyverse,但无法完全获得。

这就是您想要的吗?

library(readr)
library(dplyr)
df <- read_table("v1 v2
1   10779
2   911
3   13897
4   2780
5   13552
6   1112
7   15352
8   2036
9   11779
10  790")

df %>%
mutate(grp = (v1 - 1) %/% 2) %>%
group_by(grp) %>%
summarize(v = v2[2] / (sum(v2)))
#> # A tibble: 5 x 2
#>     grp      v
#>   <dbl>  <dbl>
#> 1     0 0.0779
#> 2     1 0.167 
#> 3     2 0.0758
#> 4     3 0.117 
#> 5     4 0.0629

尽管我支持@r2evans的评论,即通过将行分散到单独的列中,可以更好地组织这些数据。这会让你对你试图创造的比例更有表现力。这里有一个例子:

library(tidyr)
df %>%
mutate(grp = (v1 - 1) %/% 2,
rank = (v1 - 1) %% 2 + 1) %>%
select(-v1) %>%
pivot_wider(names_from = rank, values_from = v2, names_prefix = "Row") %>%
mutate(val = Row2 / (Row1 + Row2))
#> # A tibble: 5 x 4
#>     grp  Row1  Row2    val
#>   <dbl> <dbl> <dbl>  <dbl>
#> 1     0 10779   911 0.0779
#> 2     1 13897  2780 0.167 
#> 3     2 13552  1112 0.0758
#> 4     3 15352  2036 0.117 
#> 5     4 11779   790 0.0629

我认为您的数据可以按列重新组织。此代码每隔一行将它们放入各自的列中:

ind <- seq(1, nrow(dat), by = 2)
dat2 <- data.frame(V1 = dat[ind,], V2=dat[ind+1,])
dat2
#      V1   V2
# 1 10779  911
# 2 13897 2780
# 3 13552 1112
# 4 15352 2036
# 5 11779  790

从这里开始,您的数学运算就是直接的data.frame运算,无论是基本运算、整洁运算还是数据表运算:

底座

with(dat2, V2 / (V1 + V2))
# [1] 0.07792985 0.16669665 0.07583197 0.11709225 0.06285305

或作为新列:

within(dat2, { newcol = V2 / (V1 + V2) })
#      V1   V2     newcol
# 1 10779  911 0.07792985
# 2 13897 2780 0.16669665
# 3 13552 1112 0.07583197
# 4 15352 2036 0.11709225
# 5 11779  790 0.06285305

tidyverse

library(dplyr)
dat2 %>%
mutate(newcol = V2 / (V1 + V2))
#      V1   V2     newcol
# 1 10779  911 0.07792985
# 2 13897 2780 0.16669665
# 3 13552 1112 0.07583197
# 4 15352 2036 0.11709225
# 5 11779  790 0.06285305

数据表

library(data.table)
as.data.table(dat2)[, newcol := V2 / (V1 + V2) ][]
#       V1   V2     newcol
# 1: 10779  911 0.07792985
# 2: 13897 2780 0.16669665
# 3: 13552 1112 0.07583197
# 4: 15352 2036 0.11709225
# 5: 11779  790 0.06285305

你的意思是:

library(dplyr)
df %>% mutate(Lag=lag(V2),Val=V2/(V2+Lag))
V1    V2   Lag        Val
1   1 10779    NA         NA
2   2   911 10779 0.07792985
3   3 13897   911 0.93847920
4   4  2780 13897 0.16669665
5   5 13552  2780 0.82978202
6   6  1112 13552 0.07583197
7   7 15352  1112 0.93245870
8   8  2036 15352 0.11709225
9   9 11779  2036 0.85262396
10 10   790 11779 0.06285305

一个可能的解决方案(但不是tidyverse(:

vector<-c(10779,911,13897,2780,13552,1112,15352,2036,11779,790)    
sapply(c(2:length(vector)),function(x){
vector[x]/(vector[x-1]+vector[x])
},simplify=TRUE)

看看这个。

library(dplyr)
a=seq(1:10)
b=c(10779,911,13897,2780,13552,1112,15352,2036,11779,790)
d=c(0,b[1:9])
c=b+d
df=data.frame(a,b,ratio)
df <- data.frame(col1= a, col2 = b,ratio=ratio)
df %>% dplyr::filter(row_number() %% 2 == 0)
#Output
# col1 col2      ratio
# 1    2  911 0.07792985
# 2    4 2780 0.16669665
# 3    6 1112 0.07583197
# 4    8 2036 0.11709225
# 5   10  790 0.06285305

相关内容

最新更新