以特定顺序折叠列值并将缺失值保留为 R 中的 NA

collapsing columns values in a specific order and leaving the missing values as NA in R

我正在使用 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

因此,在 roder 中填充数据需要创建一个新列,该列首先使用 B 列的数据,因为 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

使用 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))