Сократите данные без потери информации - PullRequest
0 голосов
/ 06 октября 2018

Предположим, у меня есть две таблицы данных

df1
       x   y    f(x,y)
1      a   A    3
2      b   E    4
3      a   E    5
4      b   A    2

и

df2
       x   y    f(x,y)
1      a   A    4
2      b   E    4
3      a   E    4
4      b   A    2

Если мы интерпретируем столбцы x и y как влияние на некоторые результаты, то мы можем сказать, что вво втором примере (df2) результат не зависит от столбца y для x = a.Что я хотел бы сделать для генерации отчета - это удалить все столбцы, которые не влияют на результат, поэтому я хотел бы создать df2_out вместо df2 (чтобы избежать больших таблиц)

df2_out
       x   y    f(x,y)
1      a   -    4
2      b   E    4
3      b   A    2

, тогда как df1 должен оставаться без изменений, поскольку x, y влияет на результат:

df1_out
       x   y    f(x,y)
1      a   A    3
2      b   E    4
3      a   E    5
4      b   A    2

Как я могу добиться этого в R?Есть ли лучший способ напечатать таблицу данных?

1 Ответ

0 голосов
/ 06 октября 2018

Ваш ожидаемый результат означает, что вы заинтересованы только в корректировке случаев, когда результат f() не зависит от y.Для этого можно использовать dplyr методы:

library(dplyr)

find_independent <- function(data) {
  data %>%
    inner_join(data %>% 
                 group_by(x, f) %>% 
                 count(), 
               by=c("x", "f")) %>% 
    mutate(y = if_else(n == 2, "_", y)) %>%
    distinct()
}

find_independent(df1)
  x y f
1 a A 3
2 b E 4
3 a E 5
4 b A 2

find_independent(df2)
  x y f
1 a _ 4
2 b E 4
3 b A 2

Объяснение (на примере df2):

  • Сначала group_by x и f и подсчитайте количество вхождений.

    df2 %>% group_by(x, f) %>% count()
    # A tibble: 3 x 3
    # Groups:   x, f [3]
      x         f     n
      <chr> <int> <int>
    1 a         4     2
    2 b         2     1
    3 b         4     1
    
  • Объедините этот счетчик с исходным фреймом данных, и для строк, где n == 2, измените значение y на _.

  • Удаление дублирующихся строк (которые будут строками, в которых y не влияет на f), используя distinct().

Данные:

df1 <- structure(list(x = c("a", "b", "a", "b"), y = c("A", "E", "E", 
"A"), f = c(3L, 4L, 5L, 2L)), class = "data.frame", row.names = c(NA, 
-4L))
df2 <- structure(list(x = c("a", "b", "a", "b"), y = c("A", "E", "E", 
"A"), f = c(4L, 4L, 4L, 2L)), class = "data.frame", row.names = c(NA, 
-4L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...