首页 > 解决方案 > 对多个数据进行排序并删除R中第一列中的重复项

问题描述

这是示例的一部分,但考虑到我在输出中有更多列。

df <- tribble(
    ~Name1, ~id1,   ~place1,
    "john, Saboor", 12, 1,
    "Rose,Keely",   13, 2,
    "Kate, Kaomeri",    17, 1,
    "Ellis,Jorey",  19, 2,
    "john, Saboor", 20, 3,
    "john, Saboor", 23, 5,
    "Rose,Keely",   18, 4,
    "Harry,komi",   33, 1,
    "Harry,komi",   32, 4,
    "john, Saboor", 20, 3
    
)

逻辑是,在 Name1 中,我们有几个人,但是这些人的 id1 和 place1 不同。为了得到感兴趣的输出,假设“john, Saboor”,他在 Name1 中重复了 4 次。我想第一次将他保留在 column1 中,然后在 Name1 中删除他的所有信息。

接下来,我想将其视为 Name2、Name3、Name 4、Name5.... 并将他的信息保存在接下来的列中。如您所见,他重复了 4 次,然后您会在 Name1、Name2、Name3 和 Name4、id4 和 place4 中看到他的名字。下面,请查看感兴趣的输出。

我希望将 NA 视为空白

Name1   id1 place1  Name2   id2 place2  Name3   id3 place3  Name4   id4 place4
john, Saboor    12  1   NA  NA  NA  NA  NA  NA  NA  NA  NA
Rose,Keely  13  2   NA  NA  NA  NA  NA  NA  NA  NA  NA
Kate, Kaomeri   17  1   NA  NA  NA  NA  NA  NA  NA  NA  NA
Ellis,Jorey 19  2   NA  NA  NA  NA  NA  NA  NA  NA  NA
NA  NA  NA  john, Saboor    20  3   NA  NA  NA  NA  NA  NA
NA  NA  NA  NA  NA  NA  john, Saboor    23  5   NA  NA  NA
NA  NA  NA  Rose,Keely  18  4   NA  NA  NA  NA  NA  NA
Harry,komi  33  1   NA  NA  NA  NA  NA  NA  NA  NA  NA
NA  NA  NA  Harry,komi  32  4   NA  NA  NA  NA  NA  NA
NA  NA  NA  NA  NA  NA  NA  NA  NA  john, Saboor    20  3

标签: rdplyr

解决方案


使用dplyrtidyr库,您可以:

library(dplyr)
library(tidyr)

df %>%
  #Change the columns to character
  mutate(across(.fns = as.character), 
  #Create a row number column
         row = row_number()) %>%
  #Get data in long format
  pivot_longer(cols = -row) %>%
  #Remove number from each of the column name
  mutate(name = gsub('\\d+', '', name),
  #Create a unique group number for each unique name
         grp = match(value, unique(value[name == 'Name']))) %>%
  #Fill `NA` values by previous non-NA value
  fill(grp) %>%
  #For each grp and column name
  group_by(grp, name) %>%
  #Create an incremental column number
  mutate(name = paste0(name, row_number())) %>%
  #Get data in wide format
  pivot_wider(values_fill = '') %>%
  ungroup %>%
  #Remove unwanted columns
  select(-row, -grp) %>%
  data.frame()

推荐阅读