2017-10-30 8 views
2

重複したx値があるデータフレームがあります。これらの値は範囲に関連付けられています。複製された値(重複したx値)と重複する範囲(両方の行が上下の列に重なっている)は削除する必要がありますが、参照する値(val列)を保持します。重複した値から重複している範囲を削除し、関連する値を保持する方法はありますか?

library(dplyr) 
df = data.frame(x=c("A","A","A","B","B","B","C"), 
      low = c(-10,-5,100,100,200,300,10), 
      up = c(2,3,200,150,250,350,20), 
      val = c(1,2,150,125,225,325,15)) 
df 
    x low up val 
1 A -10 2 1 
2 A -5 3 2 
3 A 100 200 150 
4 B 100 150 125 
5 B 200 250 225 
6 B 300 350 325 
7 C 10 20 15 

ご覧のとおり、1行目と2行目が重なっています。 the example hereを見てください。私はdplyrコードを書こうとしましたが、期待通りの結果が得られていません。この例との違いは、2つのデータセットを「マージしていない」ということです。だから私は重複した値を含むデータセット内の異なる範囲をテストする方法を知らない。データセットに重複した値をグループ化し、個別にテストすることを考えていました。しかし、それはdplyr関数に統合されていないので、動作していないと思います。最後に

df.gr = df %>% 
    group_by(x) 

df.gr[with(df.gr, low <= up),] 

、私はあなたが見ることができるように、重複している範囲のために、私は最も低い値を維持していて、2つの範囲の最高この

x low up val 
1 A -10 3 1,2 
2 A 100 200 150 
3 B 100 150 125 
4 B 200 250 225 
5 B 300 350 325 
6 C 10 20 15 

ような何かをしたいです。また、 "val"列の値を "記憶"したい。それで、重複している範囲で1,2で終わりたいのです。

また、ここで引用している例では、重複した値ごとに2つの範囲しかありませんでした。私の場合、2つ以上の重複した値を持つことができます。私は重複した値をテストし、それらの範囲をテストし、重複しているかどうか確認したい。

例えば、

df = data.frame(x=c("A","A","A","A","B","B","B","C"), 
      low = c(-10,-5,-2,100,100,200,300,10), 
      up = c(2,3,4,200,150,250,350,20), 
      val = c(1,2,3,150,125,225,325,15)) 

df 
    x low up val 
1 A -10 2 1 
2 A -5 3 2 
3 A -2 4 3 
4 A 100 200 150 
5 B 100 150 125 
6 B 200 250 225 
7 B 300 350 325 
8 C 10 20 15 

を与えるだろう:

x low up val 
1 A -10 4 1,2,3 
2 A 100 200 150 
3 B 100 150 125 
4 B 200 250 225 
5 B 300 350 325 
6 C 10 20 15 

を私も運なしで整頓にspread機能を使用することを試みた:基本的に

tidyr::spread(df,x,val) 
    low up A B C 
1 -10 2 1 NA NA 
2 -5 3 2 NA NA 
3 -2 4 3 NA NA 
4 10 20 NA NA 15 
5 100 150 NA 125 NA 
6 100 200 150 NA NA 
7 200 250 NA 225 NA 
8 300 350 NA 325 NA 

、I場合これを使用したいのですが、キーとして置く必要があります th私はそれをすることはできません。また、複製された各値の重複数によって、データグラム変数が異なる列を作成するときにそのサイズが変わることになります。だから私はこれを進める方法を知らない...

+0

連結された行の中で、複数の値を同じ値にすることはできますか? '1,2,2,3'など? –

+0

いいえ、xの同じ重複値に対して、私は同じ第2のvalを持たないでしょう。 –

+0

私の答えは一般的で優雅なソリューションで更新されました –

答えて

1

編集:ここでは

たちはグループの変更を特定するブール値を作成するシンプルなソリューションである複雑な再帰的な解決のための編集履歴を参照してください

output <- df %>% group_by(x) %>% summarise(low = min(low), up = max(up), values = paste(val,collapse=",")) 

この

は、このDFを出力します、このブール値のcumsumはグループ識別子を与え、この識別子に group_byを使用して値を要約します。

library(dplyr) 
# Example 1 
df = data.frame(x=c("A","A","A","B","B","B","C"), 
       low = c(-10,-5,100,100,200,300,10), 
       up = c(2,3,200,150,250,350,20), 
       val = c(1,2,150,125,225,325,15)) 

df %>% arrange(x,low) %>% 
    group_by(x,set = cumsum(c(TRUE,x[-1] != x[-n()] | low[-1] > up[-n()]))) %>% 
    summarize(low=min(low),up=max(up),val=lst(val)) %>% 
    print.data.frame 

# x set low up val 
# 1 A 1 -10 3 1, 2 
# 2 A 2 100 200 150 
# 3 B 3 100 150 125 
# 4 B 4 200 250 225 
# 5 B 5 300 350 325 
# 6 C 6 10 20 15 

# Example 2 
df = data.frame(x=c("A","A","A","A","B","B","B","C"), 
       low = c(-10,-5,-2,100,100,200,300,10), 
       up = c(2,3,4,200,150,250,350,20), 
       val = c(1,2,3,150,125,225,325,15)) 

df %>% arrange(x,low) %>% 
    group_by(x,set = cumsum(c(TRUE,x[-1] != x[-n()] | low[-1] > up[-n()]))) %>% 
    summarize(low=min(low),up=max(up),val=lst(val)) %>% 
    print.data.frame 

# x set low up  val 
# 1 A 1 -10 4 1, 2, 3 
# 2 A 2 100 200  150 
# 3 B 3 100 150  125 
# 4 B 4 200 250  225 
# 5 B 5 300 350  325 
# 6 C 6 10 20  15 
0

これは動作する可能性があります。私はあなたがペーストコマンド内で "崩壊"を使用する必要があると信じています。

structure(list(x = structure(1:3, .Label = c("A", "B", "C"), class = "factor"), 
    low = c(-10, 100, 10), up = c(200, 350, 20), values = c("1,2,3,150", 
    "125,225,325", "15")), class = c("tbl_df", "tbl", "data.frame" 
), .Names = c("x", "low", "up", "values"), row.names = c(NA, 
-3L)) 

# A tibble: 3 x 4 
     x low up  values 
    <fctr> <dbl> <dbl>  <chr> 
1  A -10 200 1,2,3,150 
2  B 100 350 125,225,325 
3  C 10 20   15 
+1

しかし、私は重複した値をすべて要約したくありません。重複した値から重複した値を取り除きたいだけです。重複しているかどうかに関わらず、実際にはコードは重複した行をすべて削除しています... –

関連する問題