2016-08-09 18 views
0

異なるdata.frameで完全に動作するが、同様の条件で動作するコードを調整する必要があります。ここで特定の行の値に応じてデータフレームに列を追加する(2)

私data.frameの例:

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) 

私はこれらのnew_col値は含める必要が1から4までの値が含まれている私のdata.frameに新しい列(new_col)を追加する必要があり、 x = 9526,1913,2286,14329(列Day)の各1日(x)日(x +1)および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は、(例えば、より複雑である、すなわちより列、およびより多くの値)。

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 <試す - カット($デイDF、C(-Inf、X、INF)、右= F)'。 – AntoniosK

+0

'df $ Day'にはもっと多くの値がありますか?お互いに非常に離れた異なるグループに属している値ですか? –

+0

'' Day'列に必要な 'x'をすべて知っていますか? – cderv

答えて

1

Dayの値が、Dayの最後の2桁を削除すると、各グループがラベルとしてシーケンス番号を持つ要素に変換されたことがわかります。パッケージは使用されません。

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 

別の可能性は、以下の1つを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、全て我々はxであることを確認することができ、次に表示されることguaranttedされている場合の

centers <- with(df, unique(Day[ ! ((Day-1) %in% Day) & ! ((Day-2) %in% Day) ]) + 1) 
g <- kmeans(df$Day, centers)$cluster 

(D)simplicationグループが十分に分離され、それはと思われる質問に示すデータに基づいている場合kmeansソリューションが動作するはず

# 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 

:なしx-1ので、我々は(c)を簡素化することはできませんがある場合はシーケンスの最初の彼らです。ベースRを使用して

0

、あなたは、あなたのオリジナルのもので、このdata.frameをマージし、ID列、希望日(xx+1x+2)とし、必要new_colで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 
関連する問題