2016-08-09 3 views
0

다른 data.frame과 완벽하게 작동하지만 비슷한 조건의 코드를 조정해야합니다. 여기특정 행 값에 따라 데이터 프레임에 열 추가 (2)

내 data.frame의 예 :

내가 1이 new_col 값을 포함해야 4. 값을 포함 내 data.frame에 새 열 ( new_col)를 추가 할 필요가
df <- read.table(text = 'ID Day Count 
    33012 9526 4 
    35004 9526 4 
    37006 9526 4 
    37008 9526 4 
    21009 1913 3 
    24005 1913 3 
    25009 1913 3 
    22317 2286 2 
    37612 2286 2 
    25009 14329 1 
    48007 9527 0 
    88662 9528 0 
    1845 9528 0 
    8872 2287 0 
    49002 1914 0 
    1664 1915 0', header = TRUE) 

, x = 9526, 1913, 2286, 14329 (열 Day)의 각 일, 요일 (x) 일 (x +1) 및 일 (x + 2)

내 출력은 다음과 같아야합니다

ID Day Count new_col 
33012 9526 4  1 
35004 9526 4  1 
37006 9526 4  1 
37008 9526 4  1 
21009 1913 3  2 
24005 1913 3  2 
25009 1913 3  2 
22317 2286 2  3 
37612 2286 2  3 
25009 14329 1  4 
48007 9527 0  1 
88662 9528 0  1 
1845 9528 0  1 
8872 2287 0  3 
49002 1914 0  2 
1664 1915 0  2 

다음 될 것 new_col에 의해 주문한 data.frame :

ID Day Count new_col 
33012 9526 4  1 
35004 9526 4  1 
37006 9526 4  1 
37008 9526 4  1 
48007 9527 0  1 
88662 9528 0  1 
1845 9528 0  1 
21009 1913 3  2 
24005 1913 3  2 
25009 1913 3  2 
49002 1914 0  2 
1664 1915 0  2 
22317 2286 2  3 
37612 2286 2  3 
8872 2287 0  3 
25009 14329 1  4 

내 실제 data.frame는 (예보다 더 복잡 즉 더 열 및 기타 값은 Count 열).

x <- c(1913, 2286, 9526, 14329) 
df$new_col <- cut(df$Day, c(-Inf, x, Inf)) 
df$new_col <- as.numeric(factor(df$new_col, levels=unique(df$new_col))) 

그러나 그것은 단지 일 X, 일 X -1 일 X -2와 함께 작동 :

내 앞의 질문 (Add column to dataframe depending on specific row values)에서 저를 제안 @mrbrick 코드는 다음과 같다.

어떤 제안이라도 도움이 될 것입니다.

+0

잘라 내기 명령에서'df $ new_col <- cut (df $ Day, c (-Inf, x, Inf), right = F)'을 시도하십시오. – AntoniosK

+0

'df $ Day'의 값이 더 많습니까? 서로 매우 다른 그룹에 속하는 값입니까? –

+0

'Day'열에서 원하는 'x'를 모두 아십니까? – cderv

답변

1

다른 순차 그룹의 Day 값이 Day의 마지막 두 자릿수를 버리면 각 그룹이 레이블로 일련 번호가있는 인수로 변환됩니다. 패키지가 사용되지 않습니다.

g <- df$Day %/% 100 
u <- unique(g) 
transform(df, new_col = factor(g, levels = u, labels = seq_along(u))) 

주는 :

 ID Day Count new_col 
1 33012 9526  4  1 
2 35004 9526  4  1 
3 37006 9526  4  1 
4 37008 9526  4  1 
5 21009 1913  3  2 
6 24005 1913  3  2 
7 25009 1913  3  2 
8 22317 2286  2  3 
9 37612 2286  2  3 
10 25009 14329  1  4 
11 48007 9527  0  1 
12 88662 9528  0  1 
13 1845 9528  0  1 
14 8872 2287  0  3 
15 49002 1914  0  2 
16 1664 1915  0  2 

다른 가능성은 다음 중 하나로 g <- ... 라인을 교체하는 것이다

상기 해당 번호로 기 사용 kmeans의 (a) 공지 번호 클러스터 수 :

g <- kmeans(df$Day, 4)$cluster 
,

(b)는 수동 또는 수동 설정 중심을 설정하고 kmeans을 시작하는 것을 사용

centers <- c(1913, 2286, 9526, 14329) + 1 
g <- kmeans(df$day, centers)$cluster 

(c) 검사, X 1, X-2 또는 이런 centers 파생. x 일 경우 x-1 또는 x-2이 없으므로 x이 시퀀스의 첫 번째 여야하므로 이러한 값을 선택하고 1을 추가하여 센터를 가져와야합니다. 우리가 클러스터의 수를 알아야한다는 (a)와는 달리, 그리고 (b) 실제 시퀀스를 알 필요가있는 것과는 달리, 이것은 알 필요가 없다.우리 x 시퀀스에서 첫 번째의 경우, X, X + 1 및 X + 2는 모두 다음 나타나는 우리가 확신 할 수 guarantted 경우

centers <- with(df, unique(Day[ ! ((Day-1) %in% Day) & ! ((Day-2) %in% Day) ]) + 1) 
g <- kmeans(df$Day, centers)$cluster 
는 마지막 포인트 (d) simplication은 또는 x이다

것을 에 더 x-1 그래서 우리는 (C)를 간단 수있을 경우 순차적으로 제 :

# assumes x, x+1, x+2 all appear for each sequence 
centers <- with(df, unique(Day[ ! (Day-1) %in% Day ]) + 1) 
g <- kmeans(df$Day, centers)$cluster 

그룹이 충분히 분리하고 보인다 질문에 도시 된 데이터에 근거하면 kmeans 솔루션 작동해야 그들은.

0

기본 R을 사용하여, 당신은 당신이 원하는 일 (x, x+1, x+2)과 원래의 하나와 new_col 당신이 원하는, 다음 병합이 data.frame에 ID 열이있는 data.frame을 만들 수 있습니다.

당신이 가진 모든 x 일 미리 알고있는 경우 작동합니다.

df <- read.table(text = 'ID Day Count 
    33012 9526 4 
       35004 9526 4 
       37006 9526 4 
       37008 9526 4 
       21009 1913 3 
       24005 1913 3 
       25009 1913 3 
       22317 2286 2 
       37612 2286 2 
       25009 14329 1 
       48007 9527 0 
       88662 9528 0 
       1845 9528 0 
       8872 2287 0 
       49002 1914 0 
       1664 1915 0', header = TRUE) 
# identify the day you want (x variable in your example) 
x <- c(9526, 1913, 2286, 14329) 
# create new_col for each x as you wish, and repeat for x + i, then rbind the results data.frame 
new_col_df <- do.call(rbind, 
         lapply(seq(0, 2, by = 1), 
          function(add) data.frame(x = x + add, new_col = seq_along(x)) 
          ) 
        ) 
# merge with the original df 
output_df <-merge(df, new_col_df, by.x = "Day", by.y = "x") 
# ordered output is 
output_df[order(output_df$new_col),] 
#>  Day ID Count new_col 
#> 9 9526 33012  4  1 
#> 10 9526 35004  4  1 
#> 11 9526 37006  4  1 
#> 12 9526 37008  4  1 
#> 13 9527 48007  0  1 
#> 14 9528 88662  0  1 
#> 15 9528 1845  0  1 
#> 1 1913 21009  3  2 
#> 2 1913 24005  3  2 
#> 3 1913 25009  3  2 
#> 4 1914 49002  0  2 
#> 5 1915 1664  0  2 
#> 6 2286 22317  2  3 
#> 7 2286 37612  2  3 
#> 8 2287 8872  0  3 
#> 16 14329 25009  1  4 
관련 문제