我读取csv文件的每一行并将每行的第一个元素保存在列表中,然后我想在此列表上运行FFT,但是我收到此错误:
Error in fft(x) : non-numeric argument
在我的例子中,我读了4行:
con<-file("C:\\bla\\test.csv","r")
datalist<-list()
m<-list()
for(i in 1:4)
{
line<-readLines(con,n=1,warn=FALSE)
m<-list(as.integer(unlist(strsplit(line,split=","))))
datalist<-c(datalist,sapply(m,"[[",1))
}
datalist
close(con)
fftfun<- function(x) {fft(x)}
fft_amplitude <- function(x) {sqrt((Re(fft(x)))^2+(Im(fft(x)))^2)} }
apply(as.matrix(datalist),2,FUN=fftfun)
我该怎么做才能解决这个问题?
修改 我在csv文件中的行:
12,85,365,145,23
13,84,364,144,21
14,86,366,143,24
15,83,363,146,22
16,85,365,145,23
17,80,361,142,21
答案 0 :(得分:2)
您的代码似乎过于复杂。你为什么不这样做:
df <- read.csv("test.csv", header=FALSE)
x <- df[,1]
fft(x)
或者,如果你真的想逐行阅读:
con <- file("test.csv","r")
data <- NULL
for (i in 1:4) {
line<-readLines(con,n=1,warn=FALSE)
data <- c(data, as.numeric(strsplit(line,split=",")[[1]][1]))
}
close(con)
fft(data)
答案 1 :(得分:1)
让我们假设您真正的问题是:发生什么事情使得显然数字数据变为非数字?而不是在你的代码中通过令人难以置信的数量类型强制(csv到矩阵列出到as.matrix的其他列表),我建议你从简单地将一个文件读入R
并检查每列的typeof
和class
。如果有任何结果是factor
而不是numeric
,您可能需要添加参数colClasses ='character'。
如果读取的数据是数字,那么您在后续转换中会将其弄清楚。尝试尽可能简化代码。