【问题标题】:How to import txt-file with complex numbers into R?如何将带有复数的txt文件导入R?
【发布时间】:2021-08-09 13:33:54
【问题描述】:

我想将一个 txt 文件导入到 R 中,其中包含一些复数。数据集有一个标题并且是空格分隔的,小数是点分隔的。印象中数据集的样子:

a b c
1606315601.36889 -0.0119374750903214 0.0362932827218628
1606940201.38086 -0.0121142788819912 0.0360182146610096
1606210201.38693 -0.0124296203543005 0.0332458188804718
1606336201.3989 -0.0124724358297131 0.0355308140075942
1606312801.41093 -0.0126693799402413 0.0354588503147717

我曾多次尝试导入数据集,但失败了,我丢失了存储在 txt 文件中的数字的精度。 有谁知道如何将 txt 文件导入 R 保留复数?

#--------------------------------------------------------------------------------------------------
# 1st attempt

test <- base::as.data.frame(base::matrix(data = base::scan(file = test_dir, skip = 1, sep = '', dec = '.', what = 'complex'), ncol = 3, byrow = TRUE), stringsAsFactors = FALSE)
# read the txt-file and store it as a dataframe

class(test$V1)
# query whether the numbers have been read as complex numbers
[1] "character"

#---------------------------------------------------------------------------------------------------
# 2nd attempt

test <- utils::read.table(file = test_dir, skip = 1, sep = '', dec = '.', numerals = 'no.loss', colClasses = 'complex')
# read the txt-file

base::head(test, n = 5)
# print the first 5rows of the txt-file --> this will just print rounded values

【问题讨论】:

  • 嗨,我通过df &lt;- read.table(file = "./a_folder/test.txt", header = TRUE) 成功导入了关于精度的信息,您看过stackoverflow.com/questions/31383951/… 吗?
  • 您的示例不包含任何复数,我希望其形式为“2i+3”或类似的形式。它们是如何存储在文本文件中的?

标签: r import complex-numbers base txt


【解决方案1】:

可以像往常一样使用read.table 和其他方式从文本文件或内联文本中读取数据,如下例所示:

df <- read.table(text='
a b c
1606315601.36889 -0.0119374750903214 0.0362932827218628
1606940201.38086 -0.0121142788819912 0.0360182146610096
1606210201.38693 -0.0124296203543005 0.0332458188804718
1606336201.3989 -0.0124724358297131 0.0355308140075942
1606312801.41093 -0.0126693799402413 0.0354588503147717                 
', colClasses="complex", header=TRUE)

str(df)

'data.frame':   5 obs. of  3 variables:
 $ a: cplx  1.61e+09+0i 1.61e+09+0i 1.61e+09+0i ...
 $ b: cplx  -0.0119+0i -0.0121+0i -0.0124+0i ...
 $ c: cplx  0.0363+0i 0.036+0i 0.0332+0i ...

如果从值中可以清楚地看出复杂性,没有colClassesoption:

df <- read.table(text = '
a b c
2+5i 6.3  0+1i
1.3  7.8  6.0
',  header=TRUE)

str(df)

'data.frame':   2 obs. of  3 variables:
 $ a: cplx  2+5i 1.3+0i
 $ b: num  6.3 7.8
 $ c: cplx  0+1i 6+0i

如果您的数据位于外部文件中,请将参数 text 替换为文件名。

read.table("file.txt", colClasses="complex", header=TRUE)

如果列类型混合使用colClasses 的向量或自动检测。

【讨论】:

    【解决方案2】:

    就像@Paul 在评论中写的那样:

    utils::read.table(file = test_dir, skip = 1, sep = '', dec = '.', numerals = 'no.loss')

    工作正常! 但这更像是一种打印现象,很容易解决:

    base::options(digits = 20)

    (这只会打印比默认值更多的数字)。非常感谢您的帮助,@Paul! :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-24
      相关资源
      最近更新 更多