R中字符串的直方图(从chr到num)

时间:2019-07-17 13:31:44

标签: r

我是R语言的新手,并且很久以来一直困扰于此问题。考虑到它看起来多么简单,我迷惑了这么长时间。所以我们开始:

基本上,我有一个向量,我们称其为“测试”,其中包含一系列数字。

[1] "9 29 7 22 5 5 5 8 14 5 5 8 7 9 15 15 7 5 5 6 6 5 9 5 6 7 6 7 11 5 6 10 5 5 7 8 23 11 15 24 5 5 11 5 7 19 6 6 30 6 7 7 24 9 8 15 5 5 29 10 17 6 6 11 26 9 19 32 7 8 14 5 8 8 18 6 5 9 6 11 5 7 6 8 5 6 54 6 7 8 22 7 5 8 6 31 6 5 8 26 12 9 7 5 11 6 27 9 6 15 17 5 8 5 6 5 5 5 9 6 5 7 7 9 10 11 33 19 13 6 18 6 9 7 5 6 8 5 5 5 6 5 6 5 18 6 6 7 8 9 5 8 5 8 16 5 8 6 8 7 12 8 13 11 5 17 15 5 12 7 7 11 6 6 5 10 9 5 5 14 7 12 6 5 5 7 5 30 7 5 8 5 9 10 21 6 14 9 7 14 26 23 7 24 7 13 7 5 5 9 12 11 6 5 5 6 5 6 7 76 5 10 6 16 5 12 11 15 6 28 7 14 8 5 6 5 8 5 12 6 5 10 5 14 7 8 6 5 5 8 19 15 10 7 5 14 5 15 7 8 6 6 5 35 5 6 5 11 5 13 5 7 12 11 5 6 10 5 15 6 12 9 11 5 7 9 8 17 8 8 11 6 7 5 15 10 8 8 9 26,6 25 6 13 11 6 15 5 7 7 38 9 5 10 10 11 6 8 6 13 10 7 5 18 9 12 6 16 13 8 8 6 5 5 8 8 8 5 6 5 5 5 5 7 13 6 12 6 6 10 8 8 18 6 5 12 5 8 17 5 18 5 5 17 8 7 6 7 16 10 7 6 10 6 6 10 17 5 10 7 10 6 11 9 5 25 12 13 6 11 5"

R将此解释为字符串:

str(test)
chr "9 29 7 22 5 5 5 8 14 5 5 8 7 9 15 15 7 5 5 6 6 5 9 5 6 7 6 7 11 5 6 10 5 5 7 8 23 11 15 24 5 5 11 5 7 19 6 6 30..."

我想做的事情并不比这更复杂:我想创建一个直方图,绘制上面字符串中每个数字的频率(实际上,这是网络的度数分布)。

问题是我正在处理一个字符串。

> hist(test)
Error in hist.default(test) : 'x' must be numeric

但是,如果我尝试将“ test”转换为数字,它也会失败。

> as.numeric(test)
[1] NA
Warning message:
NAs introduced by coercion 

我确定解决方案在这里非常简单,但是我试图寻找解决方案很长时间没有成功。

提前感谢您的帮助!

3 个答案:

答案 0 :(得分:3)

str(test)显示这是一个字符串,因此我们可以使用scan提取元素,然后使用hist

hist(scan(text = test, what = numeric(), quiet = TRUE))

在查看OP的数据时,会有空格和,。因此,我们将其更改为单个定界符,然后使用scan

hist(scan(text = gsub(",", " ", test), what = numeric(), quiet = TRUE))

enter image description here

答案 1 :(得分:2)

我建议使用Stringr包将字符串分成一个列表,然后取消列出并存储为数字向量:

a <- "9 29 7 22 5 5 5 8 14 5 5 8 7 9 15 15 7 5 5 6 6 5 9 5 6 7 6 7 11 5 6 10 5 5 7 8 23 11 15 24 5 5 11 5 7 19 6 6 30 6 7 7 24 9 8 15 5 5 29 10 17 6 6 11 26 9 19 32 7 8 14 5 8 8 18 6 5 9 6 11 5 7 6 8 5 6 54 6 7 8 22 7 5 8 6 31 6 5 8 26 12 9 7 5 11 6 27 9 6 15 17 5 8 5 6 5 5 5 9 6 5 7 7 9 10 11 33 19 13 6 18 6 9 7 5 6 8 5 5 5 6 5 6 5 18 6 6 7 8 9 5 8 5 8 16 5 8 6 8 7 12 8 13 11 5 17 15 5 12 7 7 11 6 6 5 10 9 5 5 14 7 12 6 5 5 7 5 30 7 5 8 5 9 10 21 6 14 9 7 14 26 23 7 24 7 13 7 5 5 9 12 11 6 5 5 6 5 6 7 76 5 10 6 16 5 12 11 15 6 28 7 14 8 5 6 5 8 5 12 6 5 10 5 14 7 8 6 5 5 8 19 15 10 7 5 14 5 15 7 8 6 6 5 35 5 6 5 11 5 13 5 7 12 11 5 6 10 5 15 6 12 9 11 5 7 9 8 17 8 8 11 6 7 5 15 10 8 8 9 26,6 25 6 13 11 6 15 5 7 7 38 9 5 10 10 11 6 8 6 13 10 7 5 18 9 12 6 16 13 8 8 6 5 5 8 8 8 5 6 5 5 5 5 7 13 6 12 6 6 10 8 8 18 6 5 12 5 8 17 5 18 5 5 17 8 7 6 7 16 10 7 6 10 6 6 10 17 5 10 7 10 6 11 9 5 25 12 13 6 11 5"

library(stringr)

b <- as.numeric( unlist ( str_split (a, " ")))

hist(b)

我得到的直方图:

enter image description here

答案 2 :(得分:1)

看起来您的测试“向量”只是一个长字符串。 数值向量如下:

nums <- c(1,2,3,4,5,6)

您还可以制作一个字符向量并将其转换,就像您尝试过的那样:

chars <-  c("1","2","3","4","5","6")
nums <- as.numeric(chars)

您的值更像:

char <- "1 2 3 4 5 6"

它不能用as.numeric()转换为数值,因为它是一个长字符串,而不是数字或字符的向量