我有一个包含许多组的 Big Data ,看起来像这样.

library(tidyverse)

df <- tibble(col1 = c("apple","apple","pple", "banana", "banana","bananna"),
             col2 = c("pple","app","app", "bananna", "banan", "banan"), 
             counts_col1 = c(100,100,2,200,200,2),
             counts_col2 = c(2,50,50,2,20,20),
             id=c(1,1,1,2,2,2))

df
#> # A tibble: 6 × 5
#>   col1    col2    counts_col1 counts_col2    id
#>   <chr>   <chr>         <dbl>       <dbl> <dbl>
#> 1 apple   pple            100           2     1
#> 2 apple   app             100          50     1
#> 3 pple    app               2          50     1
#> 4 banana  bananna         200           2     2
#> 5 banana  banan           200          20     2
#> 6 bananna banan             2          20     2

reprex package(v2.0.1)于2022-03-16创建

我希望我的数据框看起来像这样

id  central_fruit   fruits                 counts     sum_counts
 1     apple        apple,pple,app         100,50,2        152
 2    banana        banana,bananna,banan   200,20,2        222

输出的格式不必是这样.这只是一个例子.它可以是字符列表,也可以只是字符.

推荐答案

为此,我们可以先将其reshape 为"长"格式(pivot_longer),按"id"、"grp"分组,创建一个频率计数(add_count),然后通过"id"将频率为max的"中心_水果"变为summarise,同样地,paste(toString)是unique个水果,unique计数与unique计数中的sum一起

library(dplyr)
library(stringr)
library(tidyr)
df %>%
   rename_with(~ str_c("fruit_", .x), starts_with('col')) %>% 
   pivot_longer(cols = -id, names_to = c(".value", "grp"), 
     names_pattern = "(.*)_(col\\d+)") %>% 
   group_by(id, grp) %>%
   add_count(fruit) %>%
   group_by(id) %>% 
   summarise(central_fruit = fruit[which.max(n)], 
      fruits = toString(unique(fruit)), 
      sum_counts = sum(unique(counts)),
      counts = toString(sort(unique(counts), decreasing = TRUE)),
        .groups = 'drop' ) %>%
     relocate(counts, .before = 'sum_counts')

-输出

# A tibble: 2 × 5
     id central_fruit fruits                 counts     sum_counts
  <dbl> <chr>         <chr>                  <chr>           <dbl>
1     1 apple         apple, pple, app       100, 50, 2        152
2     2 banana        banana, bananna, banan 200, 20, 2        222

注意:最好将"counts"的值包装成list而不是pasteing.i、 e.不是counts = toString(sort(unique(counts), decreasing = TRUE)),而是

R相关问答推荐

R:对于没有数据的缓冲区,加权平均值为0

如何使用Cicerone指南了解R Shiny中传单 map 的元素?

基于现有类创建类的打印方法(即,打印tibles更长时间)

根据R中的另一个日期从多列中 Select 最近的日期和相应的结果

无法将传奇添加到cowplot多情节中

为什么在ggplot2中添加geom_text这么慢?

在另一个函数中调用ggplot2美学

将数据集中的值增加到当前包含的最大值

如何编辑gMarginal背景以匹配绘图背景?

根据文本字符串中的值粘贴新列

迭代到DataFrame列并获得成对的值列表(col1->;col2、col2->;col3、col3->;col4等)的正确方法.

plotly hover文本/工具提示在shiny 中不起作用

在保留列表元素属性的同时替换列表元素

停止ggplot将多行减少到一行

使用R将简单的JSON解析为嵌套框架

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

变长向量的矢量化和

主题(Legend.key=Element_RECT(Fill=&Quot;White&Quot;))不起作用

Ggplot2如何找到存储在对象中的残差和拟合值?

长/纬点继续在堪萨斯-SF结束,整齐的人口普查