【问题标题】:collapsing columns values in a specific order and leaving the missing values as NA in R以特定顺序折叠列值并将缺失值留在R中
【发布时间】:2021-02-27 16:28:44
【问题描述】:

我正在使用 R。

我有 4 个不同的数据库。每一个都有我的变量的值。一些碱基比其他碱基具有更多的价值。所以我想首先使用价值最高的那个,最后是价值最小的那个。数据长这样……

Variables   A   B   C   D

John        2   4   
Mike            6
Walter          7
Jennifer        9   8
Amanda      3
Carlos      9
Michael         3
James                   5
Kevin       4
Dennis              7
Frank
Steven
Joseph
Elvis           2
Maria           1

因此,为了填充数据,需要创建一个新列,该列首先使用 B 列的数据,因为它包含的值最多,然后是 A,然后是 C,然后是 D,​​以及缺少的那些需要是NA的。我还需要添加另一列来提供数据参考。换句话说,如果我将 B 列用于 John 的列,我需要一列来告诉我数据属于 B 列。

该列应如下所示...

Variables   E   D

John        4   B
Mike        6   B
Walter      7   B
Jennifer    9   B
Amanda      3   A
Carlos      9   A
Michael     3   B
James       5   D
Kevin       4   A
Dennis      7   C
Frank       NA  NA
Steven      NA  NA
Joseph      NA  NA
Elvis       2   B
Maria       1   B

【问题讨论】:

    标签: r collapse


    【解决方案1】:

    使用tidyverse,您可以执行以下操作...

    使用pivot_longer 输入长格式。通过“B”、“A”、“C”和“D”将name 设为ordered 因子。那么当你arrange时,就可以按这个顺序得到每个人名字中的第一个值了。

    这假设您丢失的数据是NA。如果它们是空白字符值,您可以用filter 代替filter(value != "") 而不是drop_na(value)

    library(tidyverse)
    
    df %>%
      pivot_longer(cols = -Variables) %>%
      mutate(name = ordered(name, levels = c('B', 'A', 'C', 'D'))) %>%
      group_by(Variables) %>%
      drop_na(value) %>%
      arrange(name) %>%
      summarise(E = first(value),
                New_D = first(name)) %>%
      right_join(df)
    

    输出

       Variables     E New_D     A     B     C     D
       <chr>     <dbl> <ord> <dbl> <dbl> <dbl> <dbl>
     1 Amanda        3 A         3    NA    NA    NA
     2 Carlos        9 A         9    NA    NA    NA
     3 Dennis        7 C        NA    NA     7    NA
     4 Elvis         2 B        NA     2    NA    NA
     5 James         5 D        NA    NA    NA     5
     6 Jennifer      9 B        NA     9     8    NA
     7 John          4 B         2     4    NA    NA
     8 Kevin         4 A         4    NA    NA    NA
     9 Maria         1 B        NA     1    NA    NA
    10 Michael       3 B        NA     3    NA    NA
    11 Mike          6 B        NA     6    NA    NA
    12 Walter        7 B        NA     7    NA    NA
    13 Frank        NA NA       NA    NA    NA    NA
    14 Steven       NA NA       NA    NA    NA    NA
    15 Joseph       NA NA       NA    NA    NA    NA
    

    数据

    df <- structure(list(Variables = c("John", "Mike", "Walter", "Jennifer", 
    "Amanda", "Carlos", "Michael", "James", "Kevin", "Dennis", "Frank", 
    "Steven", "Joseph", "Elvis", "Maria"), A = c(2, NA, NA, NA, 3, 
    9, NA, NA, 4, NA, NA, NA, NA, NA, NA), B = c(4, 6, 7, 9, NA, 
    NA, 3, NA, NA, NA, NA, NA, NA, 2, 1), C = c(NA, NA, NA, 8, NA, 
    NA, NA, NA, NA, 7, NA, NA, NA, NA, NA), D = c(NA, NA, NA, NA, 
    NA, NA, NA, 5, NA, NA, NA, NA, NA, NA, NA)), class = "data.frame", row.names = c(NA, 
    -15L))
    

    【讨论】:

      猜你喜欢
      • 2020-11-26
      • 1970-01-01
      • 1970-01-01
      • 2013-05-22
      • 2020-10-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-28
      • 1970-01-01
      相关资源
      最近更新 更多