我有一个包含许多列的数字数据框。 我想根据观察结果在每个轴的中位数之上还是之下将其分为两类。
例如:
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解决方案?
答案 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