2

I am reading in a data file with many different rows, all of which can have different lengths like so:

dataFile <- read.table("file.txt", as.is=TRUE);

The rows can be as follows:

1 5 2 6 2 1
2 6 24
2 6 1 5 2 7 982 24 6
25 2

I need the rows to be transformed into columns. I'll be then using the columns for a violin plot like so:

names(dataCol)[1] <- "x";
jpeg("violinplot.jpg", width = 1000, height = 1000);
do.call(vioplot,c(dataCol,))
dev.off()

I'm assuming there will be an empty string/placeholder for any column with fewer entries than the column with the maximum number of entries. How can it be done?

4

2 回答 2

5

使用中的fill = TRUE参数read.table。然后要将行更改为列,请使用t转置。使用您的数据,这看起来像......

df <- read.table( text = "1 5 2 6 2 1
2 6 24
2 6 1 5 2 7 982 24 6
25 2
" , header = FALSE , fill = TRUE )

df
#  V1 V2 V3 V4 V5 V6  V7 V8 V9
#1  1  5  2  6  2  1  NA NA NA
#2  2  6 24 NA NA NA  NA NA NA
#3  2  6  1  5  2  7 982 24  6
#4 25  2 NA NA NA NA  NA NA NA

t(df)
#   [,1] [,2] [,3] [,4]
#V1    1    2    2   25
#V2    5    6    6    2
#V3    2   24    1   NA
#V4    6   NA    5   NA
#V5    2   NA    2   NA
#V6    1   NA    7   NA
#V7   NA   NA  982   NA
#V8   NA   NA   24   NA
#V9   NA   NA    6   NA
于 2013-07-17T21:48:07.243 回答
0

编辑:显然read.table有一个fill=TRUE选项,这比我的答案更容易。

我以前从未使用过 vioplot,这似乎是一种奇怪的函数调用方式(而不是类似的东西vioplot(dataCol)),但我以前使用过参差不齐的数组,所以我会尝试一下。

你读过里面的数据了吗?这往往是最难的部分。下面的代码将上述数据从一个名为的文件中读取temp.txt到一个名为的矩阵中out2

file = 'temp.txt'
dat = readChar(file,file.info(file)$size)
split1 = strsplit(dat,"\n")
split2 = strsplit(split1[[1]]," ")
n = max(unlist(lapply(split2,length)))
out=matrix(nrow=n,ncol=length(split2))
tFun = function(i){
    vect = as.numeric(split2[[i]])
    length(vect)=n
    out[,i]=vect
}
out2 = sapply(1:length(split2),tFun)

我将尝试解释我所做的:第一步是通过读取每个字符readChar。然后拆分行,然后拆分每行中的元素以获取 list split2,其中 list 的每个元素都是输入文件的一行。

从那里创建一个适合您数据大小的空白矩阵,然后遍历列表并将每个元素分配给一列。

它不漂亮,但它有效!

于 2013-07-17T21:52:51.363 回答