【问题标题】:How to produce scatterplot of .txt file in R如何在 R 中生成 .txt 文件的散点图
【发布时间】:2020-04-03 04:44:47
【问题描述】:

我目前正在尝试生成一个 .txt 文件的散点图,该文件的结构如下 25 行:

age income weight

33       63      180

25       72      220 

但是,当我尝试将其转换为 csv 然后使用以下代码生成散点图时:

my_input <- read.csv2('dataInput.txt', sep = '\t', header = T)

plot(x = my_input$ageX, y = my_input$weightY)

我收到一条错误消息。我还注意到现在“年龄”“收入”和“体重”之间有一段时间,我不明白,因为我希望它们之间有一个逗号。错误信息如下:

plot.window(...) 中的错误:需要有限的“xlim”值此外: 警告消息:1:在 min(x) 中:min 没有非缺失参数; 返回 Inf 2:在 max(x) 中:max 没有非缺失参数; 返回 -Inf 3: In min(x) : min 没有非缺失参数; 返回 Inf 4:在 max(x) 中:max 没有非缺失参数; 返回 -Inf

关于如何实际获得数据散点图的任何想法?

编辑:执行

head(my_input)

age. income. weight
1  56     63     185
2  38     72     156
3  28     75     178
4  49     59     205
5  69     65     235
6  19     70     195

编辑:

str(my_input)

age.income.weight: Factor w/ 18 levels "56  63     185",..: 1 2 3 4 5 6 7 8 9 10 ...
summary(my_input)
age.income.weight

 56     63     185: 1     
 38     72     156: 1     
 28     75     178: 1     
 49     59     205: 1     
 69     65     235: 1     
 19     70     195: 1     
 (Other)          :19     

【问题讨论】:

  • 当然,它现在可以了
  • @dc37 谢谢,这似乎产生了一个散点图,虽然我不确定它是否提供了正确的输出。
  • 好吧,在查看散点图时,我得到了一个完美的直线图,但在查看数字时,它们不是 1:1,所以我不希望得到这样一条直线,但更多曲线之类的。
  • @dc37 图片已添加。
  • 您的图像显示您的数据未绘制。您应该使用str(my_input) 检查您的数据是否为数字格式

标签: r input scatter-plot


【解决方案1】:

根据您对问题的编辑,您在加载 txt 文件时遇到了问题。在检查文本文件的结构时,每行和每列之间似乎没有一致的间距。

因此,使其工作的一种方法是通过使用readLines 读取数据帧来从头开始创建数据帧:

my_input <- readLines("crime_input.txt")
my_input <- unlist(strsplit(my_input," "))

现在您看到该文件包含大量空间:

> my_input
  [1] "age"    "income" "crimes" "16"     ""       ""       ""       ""       "63"     ""       ""       ""      
 [13] ""       "23"     "18"     ""       ""       ""       ""       "72"     ""       ""       ""       ""      
 [25] "25"     "18"     ""       ""       ""       ""       "75"     ""       ""       ""       ""       "22"    
 [37] "19"     ""       ""       ""       ""       "59"     ""       ""       ""       ""       "16"     "19"    
 [49] ""       ""       ""       ""       "65"     ""       ""       ""       ""       "19"     "19"     ""      
 [61] ""       ""       ""       "70"     ""       ""       ""       ""       "19"     "20"     ""       ""      
 [73] ""       ""       "78"     ""       ""       ""       ""       "18"     "21"     ""       ""       ""      
 [85] ""       "35"     ""       ""       ""       ""       "11"     "21"     ""       ""       ""       ""      
 [97] "53"     ""       ""       ""       ""       "15"     "23"     ""       ""       ""       ""       "28"    
[109] ""       ""       ""       ""       ""       "9"      "27"     ""       ""       ""       ""       "56"    
[121] ""       ""       ""       ""       "16"     "28"     ""       ""       ""       ""       "52"     ""      
[133] ""       ""       ""       "14"     "29"     ""       ""       ""       ""       "63"     ""       ""      
[145] ""       ""       "25"     "30"     ""       ""       ""       ""       "46"     ""       ""       ""      
[157] ""       "17"     "30"     ""       ""       ""       ""       "55"     ""       ""       ""       ""      
[169] "19"     "31"     ""       ""       ""       ""       "29"     ""       ""       ""       ""       ""      
[181] "8"      "32"     ""       ""       ""       ""       "55"     ""       ""       ""       ""       "22"    
[193] "32"     ""       ""       ""       ""       "62"     ""       ""       ""       ""       "25"    

所以,我们可以将所有内容都转换为数字,去掉 NA 并得到:

my_input <- as.numeric(my_input)
my_input <- my_input[!is.na(my_input)]

获得:

> my_input
 [1] 16 63 23 18 72 25 18 75 22 19 59 16 19 65 19 19 70 19 20 78 18 21 35 11 21 53 15 23 28  9 27 56 16 28 52 14
[37] 29 63 25 30 46 17 30 55 19 31 29  8 32 55 22 32 62 25

最后,我们可以用这个向量填充一个矩阵:

my_input <- matrix(my_input, nrow = 3, ncol = length(my_input)/3)
> my_input
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18]
[1,]   16   18   18   19   19   19   20   21   21    23    27    28    29    30    30    31    32    32
[2,]   63   72   75   59   65   70   78   35   53    28    56    52    63    46    55    29    55    62
[3,]   23   25   22   16   19   19   18   11   15     9    16    14    25    17    19     8    22    25

现在,我们可以转置矩阵,转换为 data.frame 并添加 colnames:

my_input <- as.data.frame(t(my_input))
colnames(my_input) <- c("age","income","crimes")

最后,你得到:

> head(my_input)
   age income crimes
1   16     63     23
2   18     72     25
3   18     75     22
4   19     59     16
5   19     65     19
6   19     70     19

如果你检查my_input的格式:

> str(my_input)
'data.frame':   18 obs. of  3 variables:
 $ age   : num  16 18 18 19 19 19 20 21 21 23 ...
 $ income: num  63 72 75 59 65 70 78 35 53 28 ...
 $ crimes: num  23 25 22 16 19 19 18 11 15 9 ...

所以,现在,您可以绘制它了:

my_input = my_input[order(my_input$age),]
plot(x = my_input$age, y = my_input$crimes, type = "b")

现在,您可以使用此文件了。希望它可以帮助您解决这个问题。

【讨论】:

  • 您能解释一下为什么使用 type = "b" 以及为什么要执行排序吗?
  • 同时去试试
  • type = "b" 表示我正在绘制点和线。排序就是得到age值的序列
  • 我使用了代码并且它有效,散点图是正确的。但是,我宁愿得到一个散点图,而不需要手动在 age = c() 和 weight = c() 中插入数字。如果你要这样做,感觉即使加载文件也没有用,而且此方法不适用于大型数据集。
  • 我忘了补充一点,这个解决方案现在确实有效,并感谢您的帮助和您提供的代码。谢谢你。我也照你说的做了,并在输入中使用了 str(),得到了以下结果:age.income.weight: Factor w/ 18 levels "number, number, number"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-26
  • 1970-01-01
  • 2021-08-16
  • 2013-10-07
  • 2018-08-08
  • 2012-03-03
  • 1970-01-01
相关资源
最近更新 更多