R:压缩数据矩阵中的数据?

时间:2018-04-27 02:25:22

标签: r

这是我的数据:

    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,..,在class1到class6的列中有一些“NA”的行,我想前几个cols应该是“non NA”值,例如:第1行:class2和class3中的PATH将移动到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 :(得分:0)

我并不完全清楚你要做的是什么,因此有两种选择。

选项1:如果您想将NA移动到行的末尾,只有它们出现在第1列中。以非NA开头的行将保持不变,即使其他位置有NA个。

我们可以做到以下几点:

# 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移至每一行的末尾。

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)

答案 1 :(得分:0)

使用applyorder na.last = TRUE的选项:

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

OR列顺序需要保持:

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