【问题标题】:Is there R codes to organise these data in R? [duplicate]是否有 R 代码可以在 R 中组织这些数据? [复制]
【发布时间】:2023-03-18 09:06:02
【问题描述】:

我想从我的数据集中删除 NA,然后按 ID 组织它们。

我的数据集是这样的:

  

  df<-read.table (text="ID  Name    Surname Group   A1  A2  A3  Goal    Sea
    21  Goal    Robi    A   4   4   4   G   No
    21  Goal    Robi    B   NA  NA  NA  NA  NA
    21  Goal    Robi    C   NA  NA  NA  NA  NA
    21  Goal    Robi    D   3   4   4   G   No
    33  Nami    Si  O   NA  NA  NA  NA  NA
    33  Nami    Si  P   NA  NA  NA  NA  NA
    33  Nami    Si  Q   3   4   4   G   No
    33  Nami    Si  Z   3   3   3   S   No
    98  Sara    Bat MT  4   4   4   S   No
    98  Sara    Bat NC  4   3   2   D   No
    98  Sara    Bat MF  NA  NA  NA  NA  NA
    98  Sara    Bat LC  NA  NA  NA  NA  NA
    66  Noor    Shor    MF  NA  NA  NA  NA  NA
    66  Noor    Shor    LC  NA  NA  NA  NA  NA
    66  Noor    Shor    MT1 4   4   4   G   No
    66  Noor    Shor    NC1 2   3   3   D   No

    ", header=TRUE)

通过删除 NA,行和列会得到一个缺少 NA 的数据框。所以我想得到这张桌子

ID  Name    Surname Group_1 A1  A2  A3  Goal_1  Sea_1   Group_2 A1_1    A2_2    A3_3    Goal_2  Sea_2
21  Goal    Robi    A   4   4   4   G   No  D   3   4   4   G   No
33  Nami    Si  Q   3   4   4   G   No  Z   3   3   3   S   No
98  Sara    Bat MT  4   4   4   S   No  NC  4   3   2   D   No
66  Noor    Shor    Mt1 4   4   4   G   No  NC1 2   3   3   D   No

有没有可能。看来我们可以使用 pivot_longer 来做到这一点,但我不知道如何获得它

【问题讨论】:

    标签: r


    【解决方案1】:

    搜索 complete.cases()

    final = final[complete.cases(final), ]

    【讨论】:

      【解决方案2】:

      Tidyverse 的可能解决方案:

      df <- structure(list(ID = c(21L, 21L, 21L, 21L, 33L, 33L, 33L, 33L, 
      98L, 98L, 98L, 98L, 66L, 66L, 66L, 66L), Name = c("Goal", "Goal", 
      "Goal", "Goal", "Nami", "Nami", "Nami", "Nami", "Sara", "Sara", 
      "Sara", "Sara", "Noor", "Noor", "Noor", "Noor"), Surname = c("Robi", 
      "Robi", "Robi", "Robi", "Si", "Si", "Si", "Si", "Bat", "Bat", 
      "Bat", "Bat", "Shor", "Shor", "Shor", "Shor"), Group = c("A", 
      "B", "C", "D", "O", "P", "Q", "Z", "MT", "NC", "MF", "LC", "MF", 
      "LC", "MT1", "NC1"), A1 = c(4L, NA, NA, 3L, NA, NA, 3L, 3L, 4L, 
      4L, NA, NA, NA, NA, 4L, 2L), A2 = c(4L, NA, NA, 4L, NA, NA, 4L, 
      3L, 4L, 3L, NA, NA, NA, NA, 4L, 3L), A3 = c(4L, NA, NA, 4L, NA, 
      NA, 4L, 3L, 4L, 2L, NA, NA, NA, NA, 4L, 3L), Goal = c("G", NA, 
      NA, "G", NA, NA, "G", "S", "S", "D", NA, NA, NA, NA, "G", "D"
      ), Sea = c("No", NA, NA, "No", NA, NA, "No", "No", "No", "No", 
      NA, NA, NA, NA, "No", "No")), class = "data.frame", row.names = c(NA, 
      -16L))
      
      new_df <- df %>% 
        drop_na() %>% 
        group_by(ID) %>% 
        mutate(n = row_number()) %>% 
        pivot_wider(
          names_from = n, 
          values_from= c(Group, A1, A2, A3, Goal, Sea)
        ) %>% 
        relocate(ends_with("2"), .after= last_col())
      
      print(new_df)
      

      【讨论】:

        【解决方案3】:

        我们可以group_by ID 列,然后过滤掉目标列中所有 NA 的行:

        df %>% group_by(ID, Name, Surname) %>%
            filter(!if_all(A1:Sea, is.na))%>%
            slice_head(n=1)
        
        # A tibble: 4 × 9
        # Groups:   ID, Name, Surname [4]
             ID Name  Surname Group    A1    A2    A3 Goal  Sea  
          <int> <chr> <chr>   <chr> <int> <int> <int> <chr> <chr>
        1    21 Goal  Robi    A         4     4     4 G     No   
        2    33 Nami  Si      Q         3     4     4 G     No   
        3    66 Noor  Shor    MT1       4     4     4 G     No   
        4    98 Sara  Bat     MT        4     4     4 S     No   
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-01-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-29
          • 2021-12-25
          • 2020-05-22
          • 1970-01-01
          相关资源
          最近更新 更多