2016-06-29 9 views
1

に同じサイズのベクトルを作成する:以下に示すように、私は3列を持つファイルがRまたはAWK

ID DIST DIST1 
ID1 0,0,142 0,0,7,1 
ID2 0,0,142 0,2,5 
ID3 0,0,141,1 0,0,8 
ID4 0,0,141,1 0,0,5,0,0,1,0,2 
ID5 0,0,108,32,2 0,0,7,1 

COLUMN2とCOLUMN3内の要素の数を数行で異なります。私は '0'を追加することでcolumn2とcolumn3に同じ数の要素を持つ必要があります。

たとえば、最初の行では、column2には3つの要素があり、column3には4つの要素があります。そのため、出力では、column2に '0'が追加され、column2とcolumn3の要素数が等しくなります。

3行目と同様に、column2には4つの要素があり、column3には3つの要素があります。そして出力では、 '0'がcolumn3に加えられて4つの要素を持ちます。行ごとにこれを行うにはRのいずれかのsoultionはあり

ID DIST DIST1 
ID1 0,0,142,0 0,0,7,1 
ID2 0,0,142 0,2,5 
ID3 0,0,141,1 0,0,8,0 
ID4 0,0,141,1,0,0,0,0 0,0,5,0,0,1,0,2 
ID5 0,0,108,32,2 0,0,7,1,0 

サンプル出力は以下のようになります。

答えて

3

これはかなりベクトル化された(R)可能性があります。私は文字ベクトル(むしろ要素)を持っており、コンマを数えるためにいくつかのstringiパッケージ関数を利用していると仮定しています(ただし、基底Rでもこれを行うことができます)、そして",0"を複製します。pad関数を使用することはできませんもう1つのベクターよりもパッド)

### Your data as I see it 
df <- read.table(text = "ID DIST DIST1 
       ID1 0,0,142 0,0,7,1 
       ID2 0,0,142 0,2,5 
       ID3 0,0,141,1 0,0,8 
       ID4 0,0,141,1 0,0,5,0,0,1,0,2 
       ID5 0,0,108,32,2 0,0,7,1", 
       header = TRUE, 
       stringsAsFactors = FALSE) ## not factors 

library(stringi) 
res <- sapply(df[-1], stri_count_fixed, ",") ## Count commas in order asses string length 
indx <- cbind(1:nrow(df), max.col(-res) + 1) ## Find the shorter strings 
df[indx] <- paste0(df[indx], stri_dup(",0", abs(res[, 1] - res[, 2]))) ## Pad ",0"s 
df 
# ID    DIST   DIST1 
# 1 ID1   0,0,142,0   0,0,7,1 
# 2 ID2   0,0,142   0,2,5 
# 3 ID3   0,0,141,1   0,0,8,0 
# 4 ID4 0,0,141,1,0,0,0,0 0,0,5,0,0,1,0,2 
# 5 ID5  0,0,108,32,2  0,0,7,1,0 
1

ここでは、私は、基地R及びforループを使用して提案することができるものです。

f <- function(v1, v2) {a <- rbind(v1, v2=v2[seq(v1)])[2,]; a[is.na(a)] <- 0; return(a);} 

for (i in 1:nrow(df)){ 
    v1 <- strsplit(df[i,]$DIST, ",")[[1]] 
    v2 <- strsplit(df[i,]$DIST1, ",")[[1]] 
    if (length(v1)>length(v2)) 
     df[i,]$DIST1 <- paste0(f(v1, v2), collapse=",") 
    else 
     df[i,]$DIST <- paste0(f(v2,v1), collapse=",") 
} 

    # ID    DIST   DIST1 
# 1 ID1   0,0,142,0   0,0,7,1 
# 2 ID2   0,0,142   0,2,5 
# 3 ID3   0,0,141,1   0,0,8,0 
# 4 ID4 0,0,141,1,0,0,0,0 0,0,5,0,0,1,0,2 
# 5 ID5  0,0,108,32,2  0,0,7,1,0 

DATA

df <- structure(list(ID = c("ID1", "ID2", "ID3", "ID4", "ID5"), DIST = c("0,0,142", 
"0,0,142", "0,0,141,1", "0,0,141,1", "0,0,108,32,2"), DIST1 = c("0,0,7,1", 
"0,2,5", "0,0,8", "0,0,5,0,0,1,0,2", "0,0,7,1")), .Names = c("ID", 
"DIST", "DIST1"), class = "data.frame", row.names = c(NA, -5L 
)) 
1
$ cat tst.awk 
{ 
    m = gsub(/,/,"&",$2) 
    n = gsub(/,/,"&",$3) 
    for (i=m; i<n; i++) { 
     $2 = $2 ",0" 
    } 
    for (i=n; i<m; i++) { 
     $3 = $3 ",0" 
    } 
    print 
} 

$ awk -f tst.awk file 
ID DIST DIST1 
ID1 0,0,142,0 0,0,7,1 
ID2 0,0,142 0,2,5 
ID3 0,0,141,1 0,0,8,0 
ID4 0,0,141,1,0,0,0,0 0,0,5,0,0,1,0,2 
ID5 0,0,108,32,2 0,0,7,1,0 

$ awk -f tst.awk file | column -t 
ID DIST    DIST1 
ID1 0,0,142,0   0,0,7,1 
ID2 0,0,142   0,2,5 
ID3 0,0,141,1   0,0,8,0 
ID4 0,0,141,1,0,0,0,0 0,0,5,0,0,1,0,2 
ID5 0,0,108,32,2  0,0,7,1,0 
f関数は等しい長さを有するように、異なる長さの2つのベクターを作製するためにトリックを行います
関連する問題