我有一个向量,在引号中包含数字(因此它们实际上是字符串),并且我试图找出向量的最大值和最小值。例如,在向量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"
作为结果。这也没有道理。有人可以帮我解释一下发生了什么吗?谢谢!
答案 0 :(得分:2)
字符串按字母顺序排序。我们可以通过将数字字符串更改为字母字符串来验证您观察到的顺序的一致性,其中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 = "")
}
将原始数字字符串绑定到其“等效”字母,然后进行排序,我们可以看到您观察到的顺序与熟悉的字母顺序相同,只是应用于数字。同样,最小值和最大值与字母顺序一致。您可能已经注意到类似的顺序,例如,如果您的文件名以数字开头,则在计算机目录中。
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"
答案 1 :(得分:1)
在您的情况下,您正在使用字符串。
要解决您的特定问题,可以使用destring()
软件包中的taRifx
函数。
请参见下面的代码:
x <- c("5", "12", "7")
install.packages("taRifx")
library(taRifx)
y <- destring(x)
sort(y)
这将取消字符串的值,现在当您要求时:
min(y)
将给您5
max(y)
将给您12