2016-08-19 4 views
1

私は一般的に5列を持っている多くの.txtファイルを持っていますが、一部の行は、例えば、より多くを持っている:貼り付けは、一緒にカンマの列は、.txtファイルを区切って

a,b,c,d,e 
a,b,c,d,e 
a,b,c,d,e 
a,b,c,d,e,f,g 
a,b,c,d,e 

私がやりたいすべてが一緒にすべての列を貼り付けています第5列よりもさらに伸びている。上記の例は次のようになります:

a,b,c,d,e 
a,b,c,d,e 
a,b,c,d,e 
a,b,c,d,e f g 
a,b,c,d,e 

私はこれをRでどのようにプログラムできますか?

+1

ファイルから直接これをやっているのですか、既にデータを読み込んでいますか? –

+1

こんにちは、ありがとう、私はそれを知らなかった!あなたの答えはとても役に立ちました。あなたは私が "read.csv"関数を使ってRからデータを取得していることを前もって知っていて、スタックオーバーフローで何をしているのか分かりませんでした。 :) 再度、感謝します! – snarble

答えて

5

を経て、私は、あなたが既にRにあなたの ".CSV" ファイルを読んでいると仮定しています:

dat <- read.csv(file, header = FALSE, fill = TRUE) 

ご提供されたデータにはほとんどテスト:

x <- "a,b,c,d,e 
     a,b,c,d,e 
     a,b,c,d,e 
     a,b,c,d,e,f,g 
     a,b,c,d,e" 

dat <- read.csv(text = x, header = FALSE, fill = TRUE) 

#   V1 V2 V3 V4 V5 V6 V7 
#1   a b c d e  
#2   a b c d e  
#3   a b c d e  
#4   a b c d e f g 
#5   a b c d e  

これはおそらく別の可能性ですか?

from <- 5 
dat[, from] <- do.call(paste, dat[from:ncol(dat)]) ## merge and overwrite 
dat[, (from+1):ncol(dat)] <- NULL ## drop 

#   V1 V2 V3 V4 V5 
#1   a b c d e 
#2   a b c d e 
#3   a b c d e 
#4   a b c d e f g 
#5   a b c d e 

私の単純なアプローチは、あなたが事前に知ってfrom必要です。それはあなたがそれを知っているようです。

3

我々はreadLinesを使用してデータセットを読み取ることができ、listに「」で「行」を分割し、list( 『はminLength』)のlengthの最小値を見つけ、論理条件( 『I1』)を作成し、 'lst'と 'minLength'より大きい要素をpasteにサブセット化し、ifelseを使用してベクトルを作成します。

lines <- readLines("yourfile.txt") 
lst <- strsplit(lines, ",") 
minLength <- min(lengths(lst)) 
i1 <- lengths(lst) > minLength 
v1 <- sapply(lst[i1], function(x) paste(x[(minLength+1):length(x)], collapse=" ")) 
v2 <- ifelse(i1, v1, "") 

注:データを読み込んでそこに列がいくつあるかを確認する必要はありません。有効な列の数が自動的に検索され、他の列が貼り付けられます。

我々はベクトル(V2「」)を作成した後、我々はread.csvfill = TRUE

df1 <- read.csv(text = lines, header = FALSE, fill = TRUE) 
df1$newCol <- v2 

それとも私たちが直接read.csvでファイルを読み、どの列を見つけることができると「行」を読むことができます最初のNAまたは ""の値を持ちます。ラインの1000年代と列の100Sがある場合は、それが(他のNAまたはデータセット内""がないと仮定して)ここで、最初のNAや""開始を確認することが困難になる

df1 <- read.csv("yourfile.txt", header = FALSE, fill = TRUE) 
i1 <- which.max(colSums(dat=="")!=0) 
#i1 <- which.max(colSums(is.na(dat))!=0) #if it is NA 
transform(df1[seq(i1-1)], newCol= do.call(paste, df1[i1:ncol(df1)])) 
#  V1 V2 V3 V4 V5 newCol 
#1  a b c d e  
#2  a b c d e  
#3  a b c d e  
#4  a b c d e f g 
#5  a b c d e  

注:私は最初の投稿です、私はさらに別のアプローチが使用だろうdo.call(paste


を使用count.fields

i1 <- min(count.fields("yourfile.txt", sep=",")) 

その後、read.csv/read.tableおよびtransformを使用して、上記の方法のようにデータセットを読み取ります。

2

UNIXベースのシステムで、あなただけの前処理 前にファイルをRに読み込むことができている場合(例はff.txtファイル):

$ paste -d ',' <(cut -f 1-4 -d ',' ff.txt) <(cut -f 5- -d ',' ff.txt | tr ',' ' ') > ff-mod.txt 

新しいファイルff-mod.txtを書き込み

$ cat ff-mod.txt 
a,b,c,d,e 
a,b,c,d,e 
a,b,c,d,e 
a,b,c,d,e f g 
a,b,c,d,e 

ファイルを容易Rに読み込むことができる。

> read.table('ff-mod.txt', sep=',') 
    V1 V2 V3 V4 V5 
1 a b c d  e 
2 a b c d  e 
3 a b c d  e 
4 a b c d e f g 
5 a b c d  e 
関連する問題