R: сжать данные в матрице данных? - PullRequest
0 голосов
/ 27 апреля 2018

Вот мои данные:

    class1  class2  class3  class4  class5  class6
1   <NA>    PATH    PATH    PATH    PATH    <NA>
2   PATH    PATH    VUS <NA>    <NA>    <NA>
3   VUS VUS VUS <NA>    <NA>    <NA>
4   PATH    PATH    VUS <NA>    <NA>    VUS
5   <NA>    PATH    PATH    <NA>    <NA>    <NA>
6   PATH    VUS VUS <NA>    VUS <NA>
7   MPATH   VUS VUS PATH    <NA>    <NA>
8   PATH    VUS VUS <NA>    <NA>    <NA>
9   VUS VUS VUS <NA>    <NA>    <NA>
10  PATH    <NA>    VUS <NA>    <NA>    <NA>
11  VUS <NA>    <NA>    VUS <NA>    <NA>
12  VUS VUS <NA>    VUS <NA>    <NA>
13  PATH    PATH    <NA>    PATH    <NA>    <NA>
14  PATH    PATH    <NA>    PATH    <NA>    <NA>
15  VUS VUS <NA>    VUS <NA>    VUS
16  VUS VUS <NA>    VUS <NA>    VUS
17  PATH    <NA>    <NA>    PATH    <NA>    <NA>
18  PATH    <NA>    <NA>    PATH    <NA>    <NA>
19  PATH    PATH    <NA>    PATH    <NA>    <NA>
20  PATH    PATH    <NA>    PATH    <NA>    <NA>

Эта матрица данных содержит 6 столбцов, от class1 до class6, каждая строка содержит PATH, VUS, .., некоторые строки с «NA» в столбце от class1 до class6, я хочу, чтобы первые несколько столбцов были «non NA» значение, например: строка 1: PATH в class2 и class3 переместится в class1 и class2. Вывод должен быть таким:

    class1  class2  class3  class4  class5  class6
1   PATH    PATH    PATH    PATH    <NA>    <NA>
2   PATH    PATH    VUS <NA>    <NA>    <NA>
3   VUS VUS VUS <NA>    <NA>    <NA>
4   PATH    PATH    VUS VUS <NA>    <NA>
5   PATH    PATH    <NA>    <NA>    <NA>    <NA>
6   PATH    VUS VUS VUS <NA>    <NA>
7   MPATH   VUS VUS PATH    <NA>    <NA>
8   PATH    VUS VUS <NA>    <NA>    <NA>
9   VUS VUS VUS <NA>    <NA>    <NA>
10  PATH    VUS <NA>    <NA>    <NA>    <NA>
11  VUS VUS <NA>    <NA>    <NA>    <NA>
12  VUS VUS VUS <NA>    <NA>    <NA>
13  PATH    PATH    PATH    <NA>    <NA>    <NA>
14  PATH    PATH    PATH    <NA>    <NA>    <NA>
15  VUS VUS VUS VUS <NA>    <NA>
16  VUS VUS VUS VUS <NA>    <NA>
17  PATH    PATH    <NA>    <NA>    <NA>    <NA>
18  PATH    PATH    <NA>    <NA>    <NA>    <NA>
19  PATH    PATH    PATH    <NA>    <NA>    <NA>
20  PATH    PATH    PATH    <NA>    <NA>    <NA>

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Опция использования apply и order с na.last = TRUE:

t(apply(m, 1, function(x)x[order(x, na.last = TRUE)]))

ИЛИ порядок столбцов необходимо поддерживать:

t(apply(m, 1, function(x){
                  ret <- x[!is.na(x)] 
                  length(ret) <- length(x)
                  ret
                       })

  #      [,1]    [,2]   [,3]   [,4]   [,5] [,6]
  # 1  "PATH"  "PATH" "PATH" "PATH" NA   NA  
  # 2  "PATH"  "PATH" "VUS"  NA     NA   NA  
  # 3  "VUS"   "VUS"  "VUS"  NA     NA   NA  
  # 4  "PATH"  "PATH" "VUS"  "VUS"  NA   NA  
  # 5  "PATH"  "PATH" NA     NA     NA   NA  
  # 6  "PATH"  "VUS"  "VUS"  "VUS"  NA   NA  
  # 7  "MPATH" "VUS"  "VUS"  "PATH" NA   NA  
  # 8  "PATH"  "VUS"  "VUS"  NA     NA   NA  
  # 9  "VUS"   "VUS"  "VUS"  NA     NA   NA  
  # 10 "PATH"  "VUS"  NA     NA     NA   NA  
  # 11 "VUS"   "VUS"  NA     NA     NA   NA  
  # 12 "VUS"   "VUS"  "VUS"  NA     NA   NA  
  # 13 "PATH"  "PATH" "PATH" NA     NA   NA  
  # 14 "PATH"  "PATH" "PATH" NA     NA   NA  
  # 15 "VUS"   "VUS"  "VUS"  "VUS"  NA   NA  
  # 16 "VUS"   "VUS"  "VUS"  "VUS"  NA   NA  
  # 17 "PATH"  "PATH" NA     NA     NA   NA  
  # 18 "PATH"  "PATH" NA     NA     NA   NA  
  # 19 "PATH"  "PATH" "PATH" NA     NA   NA  
  # 20 "PATH"  "PATH" "PATH" NA     NA   NA 
0 голосов
/ 27 апреля 2018

Мне не совсем понятно, что вы пытаетесь сделать, поэтому есть два варианта.

Вариант 1: если вы хотите переместить NA s в конец строки , только если они встречаются в столбце 1 . Строка, начинающаяся с не-NA, останется неизменной, даже если в других позициях NA s.

Мы можем сделать следующее:

# Function to circular shift entries to the left 
lshift <- function(x) {
  c(tail(x, -1), head(x, 1))
}

as.data.frame(t(apply(df, 1, function(x) {
    while (x[1] == "<NA>") x <- lshift(x); x;
})))
#     V1   V2   V3   V4   V5   V6
#1   PATH PATH PATH PATH <NA> <NA>
#2   PATH PATH  VUS <NA> <NA> <NA>
#3    VUS  VUS  VUS <NA> <NA> <NA>
#4   PATH PATH  VUS <NA> <NA>  VUS
#5   PATH PATH <NA> <NA> <NA> <NA>
#6   PATH  VUS  VUS <NA>  VUS <NA>
#7  MPATH  VUS  VUS PATH <NA> <NA>
#8   PATH  VUS  VUS <NA> <NA> <NA>
#9    VUS  VUS  VUS <NA> <NA> <NA>
#10  PATH <NA>  VUS <NA> <NA> <NA>
#11   VUS <NA> <NA>  VUS <NA> <NA>
#12   VUS  VUS <NA>  VUS <NA> <NA>
#13  PATH PATH <NA> PATH <NA> <NA>
#14  PATH PATH <NA> PATH <NA> <NA>
#15   VUS  VUS <NA>  VUS <NA>  VUS
#16   VUS  VUS <NA>  VUS <NA>  VUS
#17  PATH <NA> <NA> PATH <NA> <NA>
#18  PATH <NA> <NA> PATH <NA> <NA>
#19  PATH PATH <NA> PATH <NA> <NA>
#20  PATH PATH <NA> PATH <NA> <NA>

Вариант 2: Если вы хотите переместить все NA s в конец каждой строки.

as.data.frame(t(apply(df, 1, function(x) c(x[x != "<NA>"], x[x == "<NA>"]))))
#     V1   V2   V3   V4   V5   V6
#1   PATH PATH PATH PATH <NA> <NA>
#2   PATH PATH  VUS <NA> <NA> <NA>
#3    VUS  VUS  VUS <NA> <NA> <NA>
#4   PATH PATH  VUS  VUS <NA> <NA>
#5   PATH PATH <NA> <NA> <NA> <NA>
#6   PATH  VUS  VUS  VUS <NA> <NA>
#7  MPATH  VUS  VUS PATH <NA> <NA>
#8   PATH  VUS  VUS <NA> <NA> <NA>
#9    VUS  VUS  VUS <NA> <NA> <NA>
#10  PATH  VUS <NA> <NA> <NA> <NA>
#11   VUS  VUS <NA> <NA> <NA> <NA>
#12   VUS  VUS  VUS <NA> <NA> <NA>
#13  PATH PATH PATH <NA> <NA> <NA>
#14  PATH PATH PATH <NA> <NA> <NA>
#15   VUS  VUS  VUS  VUS <NA> <NA>
#16   VUS  VUS  VUS  VUS <NA> <NA>
#17  PATH PATH <NA> <NA> <NA> <NA>
#18  PATH PATH <NA> <NA> <NA> <NA>
#19  PATH PATH PATH <NA> <NA> <NA>
#20  PATH PATH PATH <NA> <NA> <NA>

Пример данных

df <- read.table(text =
    "    class1  class2  class3  class4  class5  class6
1   <NA>    PATH    PATH    PATH    PATH    <NA>
2   PATH    PATH    VUS <NA>    <NA>    <NA>
3   VUS VUS VUS <NA>    <NA>    <NA>
4   PATH    PATH    VUS <NA>    <NA>    VUS
5   <NA>    PATH    PATH    <NA>    <NA>    <NA>
6   PATH    VUS VUS <NA>    VUS <NA>
7   MPATH   VUS VUS PATH    <NA>    <NA>
8   PATH    VUS VUS <NA>    <NA>    <NA>
9   VUS VUS VUS <NA>    <NA>    <NA>
10  PATH    <NA>    VUS <NA>    <NA>    <NA>
11  VUS <NA>    <NA>    VUS <NA>    <NA>
12  VUS VUS <NA>    VUS <NA>    <NA>
13  PATH    PATH    <NA>    PATH    <NA>    <NA>
14  PATH    PATH    <NA>    PATH    <NA>    <NA>
15  VUS VUS <NA>    VUS <NA>    VUS
16  VUS VUS <NA>    VUS <NA>    VUS
17  PATH    <NA>    <NA>    PATH    <NA>    <NA>
18  PATH    <NA>    <NA>    PATH    <NA>    <NA>
19  PATH    PATH    <NA>    PATH    <NA>    <NA>
20  PATH    PATH    <NA>    PATH    <NA>    <NA>",
header = T, row.names = 1, stringsAsFactors = F)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...