Максимальное или минимальное значение вектора со строками, содержащими только числа в r. Старшинство «строковых» чисел в векторе - PullRequest
0 голосов
/ 14 января 2019

У меня есть вектор, содержащий числа в кавычках (так что они на самом деле являются строками), и я пытаюсь вычислить максимум и минимум вектора. Например, в векторе x <- c("5", "12", "7"), согласно R, max(x) равно 7, а min(x) равно 12. В этом другом векторе y <- c("1","12","13","14","15","10","38","19", "60"), max(y) равно 60, а min(y) равно 1. Кажется, что противоречие здесь. Я пробовал это несколько раз, и каждый раз получаю странные и еще более противоречивые результаты. Кроме того, sort(x) дает "12", "5", "7" в качестве результата. Это тоже не имеет смысла. Может ли кто-нибудь помочь мне объяснить, что происходит? Спасибо!

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Строки отсортированы по алфавиту. Мы можем проверить последовательность порядка, который вы наблюдаете, изменив строки чисел на строки букв, где 0 - это a, 1 - это b и т. Д.:

x <- c("5", "12", "7")
y  <- c("1","12","13","14","15","10","38","19", "60")

digit_to_letter = function(x) {
  x = strsplit(x, "")
  lets = lapply(x, function(d) letters[as.integer(d) + 1])
  sapply(lets, paste, collapse = "")
}

Связывая исходные числовые строки с их «эквивалентными» буквами и затем сортируя, мы можем видеть, что наблюдаемый вами порядок такой же, как и в обычном алфавитном порядке, только для чисел. Аналогично, min и max соответствуют алфавитному порядку. Возможно, вы заметили похожий порядок, например, в каталоге на вашем компьютере, если у вас есть файлы с именами, которые начинаются с цифр.

x_example = cbind(x, digit_to_letter(x))
y_example = cbind(y, digit_to_letter(y))

x_example[order(x), ]
#      x        
# [1,] "12" "bc"
# [2,] "5"  "f" 
# [3,] "7"  "h" 

y_example[order(y), ]
 #      y        
 # [1,] "1"  "b" 
 # [2,] "10" "ba"
 # [3,] "12" "bc"
 # [4,] "13" "bd"
 # [5,] "14" "be"
 # [6,] "15" "bf"
 # [7,] "19" "bj"
 # [8,] "38" "di"
 # [9,] "60" "ga"

Если вы хотите использовать числа в качестве чисел, используйте as.numeric() или as.integer() для преобразования числовых строк в более подходящий класс.

Один последний пример, чтобы проиллюстрировать немного лучше:

z = as.character(c(1, 2, 10, 12, 100, 101, 121, 1000, 9))
cbind(z, digit_to_letter(z))[order(z), ]
 #     z            
 # [1,] "1"    "b"   
 # [2,] "10"   "ba"  
 # [3,] "100"  "baa" 
 # [4,] "1000" "baaa"
 # [5,] "101"  "bab" 
 # [6,] "12"   "bc"  
 # [7,] "121"  "bcb" 
 # [8,] "2"    "c"   
 # [9,] "9"    "j"   
0 голосов
/ 14 января 2019

В вашем случае вы работаете со строками.

Для решения вашей конкретной проблемы вы можете использовать функцию destring(), доступную в пакете taRifx.

См. Код ниже:

x <- c("5", "12", "7")
install.packages("taRifx")
library(taRifx)
y <- destring(x)
sort(y)

Это будет уничтожать значения и теперь, когда вы спросите:

min(y) даст вам 5

max(y) даст вам 12

...