所以我有一个数据集。我需要每隔一行加一次,然后除以第二行。第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