R-rbind转置单列矩阵

R-rbind转置单列矩阵,r,dataframe,read.table,rbind,R,Dataframe,Read.table,Rbind,我对R很陌生,但似乎这是一个我还没有找到答案的具体问题 我的程序读入一些数据,然后根据我传递给它的列数向量,将该数据的某些列rbinds到几个数据帧中的一个,如下所示: filename <- c("vector", "full", "of", "filenames") colVal <- (32) InMat <- data.frame() for (i in 1:length(filename)){ file <- read.table(filename[

我对R很陌生,但似乎这是一个我还没有找到答案的具体问题

我的程序读入一些数据,然后根据我传递给它的列数向量,将该数据的某些列rbinds到几个数据帧中的一个,如下所示:

filename <- c("vector", "full", "of", "filenames")
colVal <- (32)    
InMat <- data.frame()
for (i in 1:length(filename)){
  file <- read.table(filename[i], header=TRUE, fill=TRUE, stringsAsFactors=FALSE)
  InMat <- rbind(InMat, file[c(2:dim(file)[1], colVal)])
  #...other matricies...
}

filename当您只获取一列时,它将成为一个向量。如果只是将所有值附加到一个向量而不是一个矩阵中,效果会更好

InVec <- c()
for (i in 1:length(filename)){
  file <- read.table(filename[i], header=TRUE, fill=TRUE, stringsAsFactors=FALSE)
  InVec <- c(InVec, file[-1, colVal)])
  #...other matricies...
}

InVec简短回答:
[.data.frame
(数据帧上的
[
运算符)默认情况下将输出转换为可能的最低维度(通过参数
drop=TRUE
)。如果只提取一列,则它将转换为向量,然后通过
rbind
将其他向量创建一个矩阵,并将其转换为矩阵。当提取两列或多列时,将得到一个数据帧,因此
rbind
的输出是一个数据帧

快速修复方法是更改此行:

InMat <- rbind(InMat, file[c(2:dim(file)[1], colVal)]) #old line
InMat <- rbind(InMat, file[c(2:dim(file)[1], colVal),drop=FALSE]) #new line
如果事先知道要提取的列的位置,可以使用
read.table
colClasses
参数跳过整个表的读取:

filename <- c("vector", "full", "of", "filenames")
colVal <- 32
cc <- rep.int("NULL",40) #where 40 is # of columns in table
cc[colVal] <- NA 
dfm <- lapply(filename, read.table
  , header=TRUE, fill=TRUE, colClasses=cc, stringsAsFactors=FALSE)
dfm <- do.call(rbind,dfm)

filename我想我在尝试对这些向量执行操作时遇到了一些问题。因为我在读取多个文件,所有文件的长度都不同,我的行号不一致,无法打印等等。有什么想法吗?你在执行什么操作吗?一些矩阵需要列min/max,其他的表示,最后是ey都需要写入一个csv文件。数据是每半小时一次的,并按月在文件中划分。因此,有些文件是30*48、29*48等。我不明白使用单个向量而不是单个列会遇到什么问题抱歉,出现困难是因为在某些情况下,我可能需要从输入文件中选择一列,或者几个。我有4个左右的矩阵,其中包含从包含所有这些数据的月度记录中提取的类似数据(温度、感知等)。在某些情况下,我需要7列(这是离散形式的数据,temp@1m, temp@3m在另一种情况下,在给定矩阵中,我可能只需要一列(即风速)。似乎工作得很好,尽管由于某些原因使我的代码运行速度较慢。如果我在R GUI控制台中运行代码,它似乎在第一次调用Lappy时就会减慢。它会暂停2-5秒左右。(仅供参考,我正在使用您建议的第二段代码)。而且它比第一位代码慢?如果不查看数据,但指定列的类别(例如,
“character”
,而不是
NA
),我无法确切说明为什么会出现这种情况可能会有帮助。谢谢,使用你的第三个建议,我得到了更好的结果。在某些情况下,文件长度超过17000行,超过100+列。我想在我的旧for循环中,由于控制台没有一直打印内容,所以损失的时间少了一点。再次感谢你的建议!
filename <- c("vector", "full", "of", "filenames")
colVal <- 32
cc <- rep.int("NULL",40) #where 40 is # of columns in table
cc[colVal] <- NA 
dfm <- lapply(filename, read.table
  , header=TRUE, fill=TRUE, colClasses=cc, stringsAsFactors=FALSE)
dfm <- do.call(rbind,dfm)