这是我的数据:
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>
答案 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)
使用apply
和order
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