Разделение двух значений строки на основе группы и условия - PullRequest
2 голосов
/ 05 июня 2019

Я хочу разделить значения в 4-м столбце («Количество») на 2 строки, из которых первые столбцы имеют одинаковое значение.

Я пытался использовать 'group_by', но не мог 'Скажите R, что я хочу разделить значение FAST Count на значение SLOW Count.Другими словами, я не мог понять, как получить доступ к этим значениям индивидуально.

cells <- rep(c("CELL1","CELL2"), times =2 , each = 4)
temps <- rep(c(10,20,30,40), times = 4)
corners <- rep(c("FAST","SLOW"), times = 1, each = 8)
counts <- c(3200,5000,7250,10000,150,250,400,600,2400,12000,3600,2100,50,80,120,180)

df <- data.frame(cells,temps,corners,counts)

Этот код сгенерирует фрейм данных, который выглядит следующим образом:

    cells temps corners counts
    1  CELL1    10    FAST   3200
    2  CELL1    20    FAST   5000
    3  CELL1    30    FAST   7250
    4  CELL1    40    FAST  10000
    5  CELL2    10    FAST    150
    6  CELL2    20    FAST    250
    7  CELL2    30    FAST    400
    8  CELL2    40    FAST    600
    9  CELL1    10    SLOW   2400
    10 CELL1    20    SLOW  12000
    11 CELL1    30    SLOW   3600
    12 CELL1    40    SLOW   2100
    13 CELL2    10    SLOW     50
    14 CELL2    20    SLOW     80
    15 CELL2    30    SLOW    120
    16 CELL2    40    SLOW    180

Ожидаемый результат - новый фрейм данных, который содержит ячейки, временные значения и результаты деления:

       cells temps   div_result
    1  CELL1    10     1.33
    2  CELL1    20     0.42
    3  CELL1    30     2.01
    4  CELL1    40     4.55
    5  CELL2    10     3.00
    6  CELL2    20     3.13
    7  CELL2    30     3.33
    8  CELL2    40     3.33

Ответы [ 3 ]

1 голос
/ 05 июня 2019

Одна возможность с участием dplyr может быть:

df %>%
 group_by(cells, temps) %>%
 summarise(div_result = first(counts)/last(counts))

  cells temps div_result
  <fct> <dbl>      <dbl>
1 CELL1    10      1.33 
2 CELL1    20      0.417
3 CELL1    30      2.01 
4 CELL1    40      4.76 
5 CELL2    10      3    
6 CELL2    20      3.12 
7 CELL2    30      3.33 
8 CELL2    40      3.33 
0 голосов
/ 05 июня 2019

Опция с base R

by(df[['counts']], df[c('cells', 'temps')], FUN = function(x) x[1]/x[2])

Или с data.table

library(data.table)
setDT(df)[, .(div_results = first(counts)/last(counts)), .(cells, temps)]
0 голосов
/ 05 июня 2019

Вот способ с dplyr -

df %>% 
  group_by(cells, temps) %>% 
  summarize(
    div_result = counts[corners == "FAST"]/counts[corners == "SLOW"]
  ) %>% 
  ungroup()

# A tibble: 8 x 3
  cells temps div_result
  <fct> <dbl>      <dbl>
1 CELL1    10      1.33 
2 CELL1    20      0.417
3 CELL1    30      2.01 
4 CELL1    40      4.76 
5 CELL2    10      3    
6 CELL2    20      3.12 
7 CELL2    30      3.33 
8 CELL2    40      3.33 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...