Мой вопрос является расширением этого вопроса. Я хочу выяснить, как разделить группы строк, используя dplyr с несколькими столбцами, а не для одной переменной.

У меня есть этот фреймворк:

x <- data.frame(
    name = rep(letters[1:4], each = 2),
    condition = rep(c("A", "B"), times = 4),
    value1 = c(2,10,4,20,8,40,20,100),
    value2 = c(2,10,4,20,8,40,20,100)
) 
#   name condition value1 value2
# 1    a         A     2       2
# 2    a         B    10       10
# 3    b         A     4       4
# 4    b         B    20       20
# 5    c         A     8       8
# 6    c         B    40       40
# 7    d         A    20       20
# 8    d         B   100       100

Я хочу сгруппировать по имени и разделить значения строк с condition == "B" на строки с condition == "A", чтобы получить это:

data.frame(
    name = letters[1:4],
    value1 = c(5,5,5,5),
    value2 = c(5,5,5,5)
)
#   name value1 value2
# 1    a     5       5
# 2    b     5       5
# 3    c     5       5
# 4    d     5       5

Там есть наиболее одобренный ответ Стивена Бопре на оригинальный вопрос с одной переменной:

x %>% 
group_by(name) %>%
summarise(value = value[condition == "B"] / value[condition == "A"])

Но этот ответ для случая единственного значения, я не знаю, как расширить до "summarise_at" и "summarise_all". Я пытался использовать «точку», но не могу понять правильный синтаксис.

1
Leonhardt Guass 30 Май 2019 в 21:31

2 ответа

Лучший ответ

Я придумал, как это сделать.

x %>% gather(variable, value, -(name:condition)) %>%
group_by(variable,name) %>%
summarise(value = value[condition == "B"] / value[condition == "A"]) %>%
spread(variable,value)

#  name  value1 value2
#   <fct>  <dbl>  <dbl>
# 1 a          5      5
# 2 b          5      5
# 3 c          5      5
# 4 d          5      5
1
Leonhardt Guass 30 Май 2019 в 19:55

Я не уверен, есть ли способ автоматически расширять эту функцию для каждой переменной. Я думаю, что вам нужно указать итоговую функцию для каждого значения значения.

x %>%
  group_by(name) %>%
  summarise(value1 = value1[condition == "B"] / value1[condition == "A"],
            value2 = value2[condition == "B"] / value2[condition == "A"])

#  name  value1 value2
#   <fct>  <dbl>  <dbl>
# 1 a          5      5
# 2 b          5      5
# 3 c          5      5
# 4 d          5      5
0
Craig 30 Май 2019 в 18:41
56383776