Условное преобразование в R - PullRequest
2 голосов
/ 15 апреля 2020

Рассмотрим следующий фрейм данных:

df <- data.frame(a = c("01","01","02"),
                 b = c(101,101,101),
                 c = c(101,147,101),
                 d = c(100,200,500),
                 e = c(200,400,1000))

И:

agg <- data.frame(f = c("01","01","02","02"),
                  g = c("V1","V2","V1","V3"))

Я хочу изменить столбец a в df, используя agg. То есть, если a = 01, его следует изменить на V1 и так далее. Однако в некоторых случаях некоторые a в df входят в несколько имен в g в agg. Например, 01 и 02 входят в V1. В этом случае я хочу рассчитать среднее. Тем не менее, я хочу рассчитать среднее значение для d и e в df. То есть столбцы b и c в df должны быть исправлены. Поэтому я хочу следующий кадр данных:

    a   b   c   d   e
1   V1  101 101 300 600
2   V2  101 101 100 200
3   V1  101 147 200 400
4   V2  101 147 200 400
5   V3  101 101 500 1000

Как видно, столбец d и e в строке 1 - это среднее значение.

Как это сделать в R

Ответы [ 3 ]

1 голос
/ 15 апреля 2020

Мы можем merge df с agg и взять mean для каждого значения g, b и c.

aggregate(cbind(d, e)~g + b + c, merge(df, agg, by.x = 'a', by.y = 'f'), mean)

#   g   b   c   d    e
#1 V1 101 101 300  600
#2 V2 101 101 100  200
#3 V3 101 101 500 1000
#4 V1 101 147 200  400
#5 V2 101 147 200  400
1 голос
/ 15 апреля 2020

Опция с использованием data.table

library(data.table)
setDT(agg)[df, on = .(f = a)][, lapply(.SD, mean), .(g, b, c), .SDcols = d:e]
#   g   b   c   d    e
#1: V1 101 101 300  600
#2: V2 101 101 100  200
#3: V1 101 147 200  400
#4: V2 101 147 200  400
#5: V3 101 101 500 1000
1 голос
/ 15 апреля 2020

Используя tidyverse, вы можете использовать этот подход. Вы можете объединить два фрейма данных, как показано ниже. Это предполагает, что среднее значение берется из соответствующих столбцов g, b и c.

library(tidyverse)

agg %>%
  inner_join(df, by = c("f" = "a")) %>%
  group_by(g,b,c) %>%
  summarise(d = mean(d),
            e = mean(e)) %>%
  rename(a = g)

Выход

# A tibble: 5 x 5
# Groups:   a, b [3]
  a         b     c     d     e
  <fct> <dbl> <dbl> <dbl> <dbl>
1 V1      101   101   300   600
2 V1      101   147   200   400
3 V2      101   101   100   200
4 V2      101   147   200   400
5 V3      101   101   500  1000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...