根据每一列的中位数将数据框一分为二

时间:2018-06-26 06:55:21

标签: r dplyr

我有一个包含许多列的数字数据框。 我想根据观察结果在每个轴的中位数之上还是之下将其分为两类。

例如:

library(dplyr)
df <- data_frame(x = c(rnorm(5, 1, 0.1), rnorm(5, 3, 0.1), 
                       rnorm(5, 1, 0.1), rnorm(5, 3, 0.1)), 
                 y = c(rnorm(5, -1, 0.1), rnorm(5, 5, 1), 
                       rnorm(5, 5, 1), rnorm(5, -1, 0.1)))

在这里我应该获得4组:(1,5)附近的点,(1,-1)附近的点,依此类推。

我可以使用ifelse进行此操作,并定义每个区域的限制,但实际上,我将有很多列。有没有更简单的dplyr / BaseR解决方案?

1 个答案:

答案 0 :(得分:0)

根据@docendo discimus的重要意见,此处是对问题的完整回答:

df <- df %>% mutate_all(funs(above_med = . > median(.)))
df <- df %>% mutate(Group = df %>% group_by_at(which(sapply(df, class) == "logical")) %>% group_indices())

输出看起来像这样:

# A tibble: 20 x 5
     x      y x_above_med y_above_med Group
   <dbl>  <dbl> <lgl>       <lgl>       <int>
   0.743 -0.983 FALSE       FALSE           1
   0.996 -0.901 FALSE       FALSE           1
   0.966 -1.00  FALSE       FALSE           1
   1.06  -1.18  FALSE       FALSE           1
   0.948 -0.971 FALSE       FALSE           1
   3.02   5.45  TRUE        TRUE            4
   3.19   5.59  TRUE        TRUE            4
   3.08   5.37  TRUE        TRUE            4
   3.04   3.61  TRUE        TRUE            4
   2.97   5.85  TRUE        TRUE            4
   0.969  5.27  FALSE       TRUE            2
   1.11   5.40  FALSE       TRUE            2
   1.12   5.62  FALSE       TRUE            2
   1.17   4.59  FALSE       TRUE            2
   0.899  6.19  FALSE       TRUE            2
   3.01  -0.987 TRUE        FALSE           3
   3.01  -0.963 TRUE        FALSE           3
   2.85  -1.07  TRUE        FALSE           3
   2.96  -1.00  TRUE        FALSE           3
   3.00  -0.927 TRUE        FALSE           3