2017-10-30 2 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 코드를 작성하려고했지만 기대했던 결과를 얻지 못했습니다. 이 예제와의 차이점은 두 데이터 세트를 "병합"하지 않는다는 것입니다. 따라서 중복 값이 ​​포함 된 데이터 집합 내에서 여러 범위를 테스트하는 방법을 모르겠습니다. 중복 된 값을 데이터 세트로 그룹화하고 개별적으로 테스트하려고했습니다. 하지만 dplyr 함수에 통합되지 않았기 때문에 작동하지 않는 것 같습니다. 결국

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

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

, 나는 당신이이 개 범위의 가장 높은 중복, 나는 가장 낮은 값을 유지하고있어있는 범위,보고, 수 있듯이이

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 

는 줄 것인가 : 나는 경우,

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 

기본적으로 :

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 기능을 사용하려고했습니다 이것을 사용하려면 키로 넣어야합니다. 모두 th 전자 열과 낮은 열,하지만 난 그것을 할 수 없습니다. 또한 각 중복 값의 겹치는 수는 데이터 그램 변수의 크기가 다른 열을 만들 때 달라집니다. 그래서 나는 이걸 어떻게 진행해야할지 모르겠다. ...

+0

하나의 연결된 행에 여러 번 같은 값을 가질 수 있습니까? 1,2,2,3와 같은? –

+0

아니요, x의 동일한 중복 값에 대해 두 번째 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

하지만 중복 된 값을 모두 요약하고 싶지는 않습니다. 중복 된 값에서 행을 제거하고 싶습니다. 중복되거나 상관없이 코드가 실제로 중복 된 모든 행을 제거합니다. –

관련 문제