我有以下数据:
set.seed(21)
a<-sapply(1:4, function(x) sample(0:50, 4, replace=T))
colnames(a)<-c("A","B","C","D")
n <- 4
best <- vector("character",n)
sbest <- vector("character",n)
for (i in 1:4){
best[i]=LETTERS[which(a[i,]==max(a[i,]))]
sbest[i]=LETTERS[which(a[i,]==sort(a[i,],partial=n-1)[n-1])]
}
BestO<-paste(best, sbest, sep=",")
data<-cbind(a,BestO)
A B C D BestO WHAT I WANT
[1,] "40" "48" "50" "2" "C,B" "B,C"
[2,] "12" "46" "43" "31" "B,C" "B,C"
[3,] "35" "5" "34" "8" "A,C" "A,C"
[4,] "9" "8" "47" "1" "C,A" "A,C"
换句话说,我希望每个行中的字母按字母顺序排列。有什么想法怎么做?
答案 0 :(得分:1)
您也可以进行排序,然后找到字母,就像那样
set.seed(21)
a<-sapply(1:4, function(x) sample(0:50, 4, replace=T))
colnames(a)<-c("A","B","C","D")
best <- vector("numeric",n)
sbest <- vector("numeric",n)
BestO <- NULL
n <- 4
for (i in 1:4){
best[i]=which(a[i,]==max(a[i,]))
sbest[i]=which(a[i,]==sort(a[i,],partial=n-1)[n-1])
cur <- t(letters[sort(c(best[i],sbest[i]))])
BestO[i] <- paste(cur[1],cur[2],sep=",")
}
data <- cbind(a,BestO)
答案 1 :(得分:0)
也许不是最优雅的解决方案,但它有效。我们需要排序字符数组而不是连接字符。下面将字符数据转换为数组然后对其进行排序并将字符连接在一起以获得所需的输出:
best_list <- strsplit(data[, 5], ",")
best_mat <- sapply(best_list, sort)
t_best_mat <- t(best_mat)
sorted_best <- paste(t_best_mat[, 1], t_best_mat[, 2], sep = ",")