我正在读取一个包含许多不同行的数据文件,所有行都可以有不同的长度,如下所示:
dataFile <- read.table("file.txt", as.is=TRUE);
行可以如下:
1 5 2 6 2 1
2 6 24
2 6 1 5 2 7 982 24 6
25 2
我需要将行转换为列。然后,我将使用这样的小提琴情节列:
names(dataCol)[1] <- "x";
jpeg("violinplot.jpg", width = 1000, height = 1000);
do.call(vioplot,c(dataCol,))
dev.off()
我假设任何列的空字符串/占位符都会比具有最大条目数的列具有更少的条目。怎么办呢?
答案 0 :(得分: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
答案 1 :(得分: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
读取每个角色。然后拆分行,然后拆分每行中的元素以获取列表split2
,其中列表的每个元素都是输入文件的一行。
从那里创建一个空白矩阵,其大小适合您的数据,然后遍历列表并将每个元素分配给一列。
它不漂亮,但它有效!