2016-08-31 3 views
2

次のようなファイルを編集します。awkまたはRによるファイル編集、重複している場合は値の変更

ファイル構造、3列

1. 1 xy1 0 
2. 1 xy2 0 
3. 1 xy3 0.04 
4. 1 xy4 0.05 
5. 1 xy5 0.33 
6. 1 xy6 0.33 
7. 1 xy7 0.33 

カラム3内の特定の値が発生した場合、二回又は行目の「0」のようにも数回(1ウント2、及びライン5,6における「0.33」と7)重複した値を編集したい。値が出現するたびに、重複する値を0.001だけ増やしたいと思います。

1. 1 xy1 0 
2. 1 xy2 0.001 
3. 1 xy3 0.04 
4. 1 xy4 0.05 
5. 1 xy5 0.33 
6. 1 xy6 0.331 
7. 1 xy7 0.332 

2行目、6行目、7行目の値が0.001増加しました。

awk/bashまたはRを使用してどうすればいいですか? "cut -f 3 file | sort | uniq -d"を使って重複を識別できますが、リストに既に存在する場合はどのように編集できますか?

すべてのヒントに感謝します。ありがとうございます!

+0

おかげのように見えます! 4つのソリューションのすべてが私の問題を解決し、さらにawkとRをよく理解する助けになりました! – PsoAD

答えて

6
$ awk '{$3+=(c[$3]++/1000)}1' file 
1 xy1 0 
1 xy2 0.001 
1 xy3 0.04 
1 xy4 0.05 
1 xy5 0.33 
1 xy6 0.331 
1 xy7 0.332 
+2

Upvoted!ちょうどあなたがそれをやっているとき、人々がそれを考えて苦労したとき、あなたはそれをやっていますか? – Inian

+1

ブリリアント。私はあなたの答えから毎日勉強しています。ただawkだけでなく、コード方法.. :) – Chet

+1

あなたはnon-awkユーザーのためにこれを打ち破ることができますか? RIではrawrのコメント '(... + cumsum(duplicate(...)* increment)'と同様のやり方でそれをやっていたでしょうが、awkコードは自己文書化しているのですが何らかの形で書かれています。 –

0
awk '{ 
    if (seen[$3] == "") { 
    print $1,$2,$3; seen[$3]=$3 
    } else { 
    seen[$3] += 0.001; print $1,$2,seen[$3] 
    } 
}' 

入力ファイルによっては、多くのメモリが使用されることがあります。

2

あなたのデータがデータフレーム内にあるとします。

d <- read.table(text = " 
    1 xy1 0 
    1 xy2 0 
    1 xy3 0.04 
    1 xy4 0.05 
    1 xy5 0.33 
    1 xy6 0.33 
    1 xy7 0.33", header = FALSE) 

我々は、3列の値を使用してデータフレームを分割し、各サブセット内の値に0.001を順次追加することができ:

d <- do.call(rbind, by(d, d$V3, function(x) { 
    x$V3 <- x$V3 + 0.001 * (seq_along(x$V3) - 1) 
    x 
})) 
rownames(d) <- NULL 
d 
# V1 V2 V3 
# 1 1 xy1 0.000 
# 2 1 xy2 0.001 
# 3 1 xy3 0.040 
# 4 1 xy4 0.050 
# 5 1 xy5 0.330 
# 6 1 xy6 0.331 
# 7 1 xy7 0.332 
+1

と同様 'with(d、ave(V3、V3、FUN = function(x)cumsum(duplicated(x))* .001 + x))' – rawr

0

ここでR溶液です。

dfがデータフレームの場合、whileを使用すると、目的の出力が得られます。

> while(any(duplicated(df$V3))){ 
    ind <- duplicated(df$V3) 
    df$V3[ind] <- df$V3[ind] + 0.001 
    } 
> 
> df 
    V1 V2 V3 
1 1 xy1 0.000 
2 1 xy2 0.001 
3 1 xy3 0.040 
4 1 xy4 0.050 
5 1 xy5 0.330 
6 1 xy6 0.331 
7 1 xy7 0.332 

dfは、すべての人々に多くの私の質問に返信この

> df 
    V1 V2 V3 
1 1 xy1 0.00 
2 1 xy2 0.00 
3 1 xy3 0.04 
4 1 xy4 0.05 
5 1 xy5 0.33 
6 1 xy6 0.33 
7 1 xy7 0.33 
関連する問題