减少数据而不会丢失信息

时间:2018-10-05 22:17:00

标签: r dplyr

假设我有两个数据表

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)中,对于x = a,结果与y列无关。我想要生成报告的方式是删除所有不影响结果的列,因此我想创建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 :(得分:2)

您的预期输出表明您仅对调整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 xf并计算出现的次数。

    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删除重复的行(将是fdistinct()无影响的行)。

数据:

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))