2017-01-29 5 views
0

によれば、Iは各フィールド当たり以下の好ましい条件に従って固有値を抽出したい:データフレーム<em>DF</em>をとるれる好ましい条件のセット

1- C1各VAを抽出し、それぞれの値を抽出し、C2が存在する場合、他に

2-無視し、存在する場合LUEなど

を無視...というようにアップC5

にデータ:

df <- data.frame (Field=rep(c("F1","F2","F3","F4","F5"),each=3), 
       Cond=rep(c("C1","C2","C3","C4","C5"),3), 
       Value=c(1:15)) 

所望出力:

output <- data.frame (F= c("F1","F2","F3","F4","F5"), 
        C= c("C1","C1","C2","C1","C3"), 
        Value= c(1,6,7,11,13)) 

(注1 の値は、例示としてのみ設定したものであり、 実際のデータはが順序付けされていない値)

(注2:本当の条件列が全くアルファベット順に並べていません。私はAが "Aの値"を選んだよりも存在し、そうでなければ次の条件に "Bが存在すれば..."などのようなものを持っていた)

+0

を使用しているものは、C ' '内の値がソートされていると仮定することはできますか? –

+0

@Roman、no ...値は例証の問題に限定されていただけです。 – Rui

答えて

1

別のオプションは、data.table

library(data.table) 
setDT(df)[order(Field, Cond), head(.SD, 1), by = Field] 
# Field Cond Value 
#1: F1 C1  1 
#2: F2 C1  6 
#3: F3 C2  7 
#4: F4 C1 11 
#5: F5 C3 13 
+0

はい、「Cond」がアルファベット順にソートされている場合は、実際に動作します。ただし、「ソート」列がアルファベット順に並んでいない場合、その例は機能しません。 – Rui

+0

@Ruiその場合、それを 'factor'に変換し、' order'( 'Field、factor(Cond、levels = lvl)')の順序で 'levels'を指定します。 – akrun

2

処理前にdata.frameをソートできるならこれはかなり簡単です。これはこの特定のケースで機能することに注意してください。 Condの値が変更されると、アルファベット順の並べ替えがウィンドウの外に出ることがあります。

library(dplyr) 
df <- data.frame (Field=rep(c("F1","F2","F3","F4","F5"),each=3), 
        Cond=rep(c("C1","C2","C3","C4","C5"),3), 
        Value=c(1:15)) 

df <- df[with(df, order(Field, Cond)), ] 
res <- df %>% 
    group_by(Field) %>% 
    filter(row_number() == 1) 

Source: local data frame [5 x 3] 
Groups: Field [5] 

    Field Cond Value 
    <fctr> <fctr> <int> 
1  F1  C1  1 
2  F2  C1  6 
3  F3  C2  7 
4  F4  C1 11 
5  F5  C3 13 

これは、これを行うための、より一般的な方法です。ソート順はsothis question参照)で定義されています。 Condの値をどのように変更して、それがアルファベット順にソートされていないことを示しているかに注目してください。

df <- data.frame (Field=rep(c("F1","F2","F3","F4","F5"),each=3), 
        Cond=rep(c("rg1","kl2","xy3","rq4","ab5"),3), 
        Value=c(1:15)) 

so <- c("rg1","kl2","xy3","rq4","ab5") 

df %>% 
    group_by(Field) %>% 
    slice(match(so, Cond)) %>% 
    filter(row_number() == 1) 

    Field Cond Value 
    <fctr> <fctr> <int> 
1  F1 rg1  1 
2  F2 rg1  6 
3  F3 kl2  7 
4  F4 rg1 11 
5  F5 xy3 13 
+0

本当にあなたは正しいですが、私はそれが問題になると思います。私の「条件付き」列はアルファベット順に並べられていません。 私はAが "Aの値"を選んだのと同じようなものを持っていましたが、そうでなければ次の条件に "Bが存在すれば..."というようにしました – Rui

+0

@Rui私は私の答えを修正しました。今あなたの一般的なケース。 –

+0

@ Roman。優れて、それは完全に動作します。多くのありがとう – Rui

関連する問題