Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 在操作列的同时创建大型矩阵_R - Fatal编程技术网

R 在操作列的同时创建大型矩阵

R 在操作列的同时创建大型矩阵,r,R,我对如何创建大型矩阵有点困惑。到目前为止,我的代码如下所示。我希望行是位置,列是来自单个文本文件的“beta_值” #Number of files = 300 #Matrix 33000 x 300 file.list <- list.files(pattern = "txt$") # for each file, run read.table and select only the 1,2,3,12th column columns = c('ID','S','E','Name','A

我对如何创建大型矩阵有点困惑。到目前为止,我的代码如下所示。我希望行是位置,列是来自单个文本文件的“beta_值”

#Number of files = 300
#Matrix 33000 x 300
file.list <- list.files(pattern = "txt$")
# for each file, run read.table and select only the 1,2,3,12th column
columns = c('ID','S','E','Name','Alias','version','cdrive','positional','Contour','total_Contour','M_values','beta_values')

#Number of rows in the matrix
nr=33000

mat <- matrix("numeric", nrow = nr, ncol = length(file.list))

for (i in 1:length(file.list)) {
 fs <- fread(file.list[i], colClasses = columns, select=c(1,2,4,12))            
 # Creating Position values given by paste(fs$V1,'_', fs$V2,'_',fs$V4, sep="") and 'beta_values' given by fs$V12
 fs_reorder <- data.frame(paste(fs$V1,'_', fs$V2,'_',fs$V4, sep=""), fs$V12)
 mat[,i] <- as.matrix(fs_reorder)
}
#文件数=300
#矩阵33000 x 300

file.list您遇到了一些数据类型问题(可能?如果没有看到任何可复制的内容,就很难确定)<代码>矩阵(“数字”,…)
将为每个条目创建一个
字符
矩阵,其中包含
“数字”
。您使用的
columns
向量似乎在指定列的名称,但在
fread
colClasses
参数中使用它。使用
paste
时,您创建了一个
character
类对象,该对象被
data.frame()
强制为
factor
fs\u reorder
似乎是一个两列数据框,其中第一列是
factor
,第二列是
fs$V12
所属的任何类,但随后将其转换为一个(2列)矩阵,并尝试将其压缩为一列
mat
。此外,还不清楚for循环迭代是否有效,或者问题是否只存在于其中一列。(for循环中的
print(i)
行可以帮助您跟踪它的进度以找出问题。)有太多潜在的bug,我猜它们都不起作用。摆脱
for
循环,用
i逐行检查代码。如果你需要额外的帮助,你需要,最好是最小的,比如说,一个5行测试文件,而不是(大概)33k行测试文件。所以我接受了你的建议,上面列出的更改-请注意-
Error in mat[, i] <- as.matrix(fs_reorder) : 
  number of items to replace is not a multiple of replacement length
> i=1
> fs <- fread(file.list[i], select=c(1,2,4,12)) 
> mat <- matrix(nrow = nr, ncol = length(file.list))  
> fs_reorder <- data.frame(paste(fs$V1,'_', fs$V2,'_',fs$V4, sep=""), fs$V12)
> mat[,i] <- as.matrix(fs_reorder)
Error in mat[, i] <- as.matrix(fs_reorder) : 
  number of items to replace is not a multiple of replacement length
> mat<- as.matrix(fs_reorder)
file.list_main <- list.files(pattern = "txt$")
file.list = file.list_main[1:2]
n   = length(position_mat)
k   = length(file.list)
mat <- matrix(nrow=n, ncol=length(file.list))
for (i in 1:length(file.list)) {
 fs <- fread(file.list[i], select=c(1,2,4,12))
 fs_reorder <- data.frame(paste(fs$V1,'_', fs$V2,'_',fs$V4, sep=""), fs$V12)
 positions = (paste(fs$V1,'_', fs$V2,'_',fs$V4, sep=""))
 betas = fs$V12    
 for(j in 1:k){
   for(i in 1:n){
        mat[i,j] = (positions[i]*betas[j])
   }
 }
}

Error:

Error in positions[i] * betas[j] : 
  non-numeric argument to binary operator
set.seed(20430)
n   = 1000
k   = 3

fileA = rnorm(n)
fileB = rnorm(n)
fileC = rnorm(n)
positions = paste("loveletters_",rnorm(n),sep="")
betas <- cbind(fileA, fileB, fileC)
for(j in 1:k){
   for(i in 1:n){
        x[i,j] = (positions[i]*betas[j])
   }
}

Results:
Error in positions[i] * betas[j] : 
  non-numeric argument to binary operator

> length(positions)
[1] 1000
> ncol(betas)
[1] 3
> nrow(betas)
[1] 1000