假设这是我的数据帧:

df <- data.frame(grp = c("ab -10", "ab 0", "ab 8", "ab -1",
                         "ab 6", "ab 6", "ab -10", "ab 1",
                         "ab -10", "ab 0", "ab 8", "ab -1",
                         "ab 6", "ab 6", "ab -10", "ab 1",
                         "d", "e", "e", "e"),
                 freq = c(1,0,0,1,0,1,2,0,1,0,2,2,1,1,0,1,0,2,2,1))
df
      grp freq
1  ab -10    1
2    ab 0    0
3    ab 8    0
4   ab -1    1
5    ab 6    0
6    ab 6    1
7  ab -10    2
8    ab 1    0
9  ab -10    1
10   ab 0    0
11   ab 8    2
12  ab -1    2
13   ab 6    1
14   ab 6    1
15 ab -10    0
16   ab 1    1
17      d    0
18      e    2
19      e    2
20      e    1

我想要:

> finaldf
     grp freq
1 ab < 0    7
2 ab 0-5    1
3  ab 5+    5
4      d    0
5      e    5

这就是我所try 的:

df %>%
  bind_rows(df %>%
              filter(!grepl("ab", grp)),
            
            df %>%
              filter(grepl("ab", grp)) %>%
              mutate(grp = parse_number(grp)) %>%
              mutate(grp = cut(as.numeric(grp),
                                          breaks = c(-999, 0, 6, 999),
                                          labels = c("ab < 0", "ab 0-5", "ab 5+"),
                                          right = F))) %>%
              group_by(grp) %>%
              summarise(N =n())

bind_rows似乎在复制数据帧.

      grp freq
1  ab -10    1
2    ab 0    0
3    ab 8    0
4   ab -1    1
5    ab 6    0
6    ab 6    1
7  ab -10    2
8    ab 1    0
9  ab -10    1
10   ab 0    0
11   ab 8    2
12  ab -1    2
13   ab 6    1
14   ab 6    1
15 ab -10    0
16   ab 1    1
17      d    0
18      e    2
19      e    2
20      e    1
21      d    0
22      e    2
23      e    2
24      e    1
25 ab < 0    1
26 ab 0-5    0
27  ab 5+    0
28 ab < 0    1
29  ab 5+    0
30  ab 5+    1
31 ab < 0    2
32 ab 0-5    0
33 ab < 0    1
34 ab 0-5    0
35  ab 5+    2
36 ab < 0    2
37  ab 5+    1
38  ab 5+    1
39 ab < 0    0
40 ab 0-5    1

我可以slice()行的一半,但我更感兴趣的是知道我做错了什么?

任何其他整洁漂亮的方法也将受到高度赞赏!

推荐答案

这里有一种方法,将列拆分为separate的"两个",重新编码数值unite,然后按sum分组

library(dplyr)
library(tidyr)
df %>% 
  separate(grp, into = c('grp1', 'value'), sep = "(?<=ab)\\s+",
   fill = "right", convert = TRUE) %>% 
  mutate(value = case_when(value <0 ~ '< 0', 
     between(value, 0, 5) ~ '0-5', value > 5 ~ '5+')) %>%
  unite(grp, grp1, value, na.rm = TRUE, sep=" ") %>% 
  group_by(grp) %>%
  summarise(freq = sum(freq), .groups = 'drop')

-输出

# A tibble: 5 × 2
  grp     freq
  <chr>  <dbl>
1 ab < 0     7
2 ab 0-5     1
3 ab 5+      5
4 d          0
5 e          5

在OP的代码中,首先需要删除df %>%个,因为我们正在bind_rows中传递两个filtered数据集.当我们添加df %>%时,它将作为第一个参数传递给bind_rows,从而复制行

library(readr)
bind_rows(df %>%
              filter(!grepl("ab", grp)),
            df %>%
              filter(grepl("ab", grp)) %>%
              mutate(grp = parse_number(grp)) %>%
              mutate(grp = cut(as.numeric(grp),
                                          breaks = c(-999, 0, 6, 999),
                                          labels = c("ab < 0", "ab 0-5", "ab 5+"),
                                          right = FALSE))) %>% 
    group_by(grp) %>%
    summarise(N =sum(freq))
# A tibble: 5 × 2
  grp        N
  <chr>  <dbl>
1 ab < 0     7
2 ab 0-5     1
3 ab 5+      5
4 d          0
5 e          5

R相关问答推荐

R箱形图gplot 2 4组但6个参数

向gggplot 2中的数据和轴标签添加大写和星号

如何计算前一行的值,直到达到标准?

selectInput不返回ALL,并将因子转换为shiny 的数字

根据选中三个复选框中的一个或两个来调整绘图

在R中使用download. file().奇怪的URL?

在R中无法读入具有Readxl和lApply的数据集

如何基于两个条件从一列中提取行

根据1个变量绘制 colored颜色 发散的 map ,由另一个变量绘制饱和度,ggplot2不工作

Geom_Hline将不会出现,而它以前出现了

识别连接的子网(R-igraph)

根据约束随机填充向量的元素

如果COLSUM为>;0,则COLNAME为向量

在gggraph中显示来自不同数据帧的单个值

远离理论值的伽马密度曲线下面积的近似

将摘要图添加到facet_WRAP gglot的末尾

创建新列,其中S列的值取决于该行S值是否与其他行冗余

整理ggmosaic图的标签

如何为包创建自定义roxygen2标签?

如何在R中添加标识连续日期的新列