Добавьте две строки, затем разделите на строку - PullRequest
1 голос
/ 14 июля 2020

Итак, у меня есть набор данных. Мне нужно добавить каждую вторую строку и разделить на вторую строку. Строка 2 разделена на (Строка 1 + Строка 2)

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

Итак, для этих данных мне понадобится [Строка 2 / (Строка 1 + Строка 2)], поэтому (911 / (10779 + 911)) и [Row 4 / (Row 3 + Row 4] et c. Я близок к использованию tidyverse, но не могу его понять.

Ответы [ 5 ]

2 голосов
/ 14 июля 2020

Я думаю, ваши данные можно реорганизовать по столбцам. Этот код берет каждую вторую строку и помещает их в отдельный столбец:

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

data.table

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
2 голосов
/ 14 июля 2020

Это то, что вы ищете?

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
1 голос
/ 14 июля 2020

Вы имеете ввиду:

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
0 голосов
/ 14 июля 2020

Проверьте это.

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
0 голосов
/ 14 июля 2020

Возможное решение (но не тидиверс):

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...