2017-06-21 6 views
-5

私はR(とstackoverflow)の新機能ですが、私は少し問題があります(私は思う)は非常に簡単なことです。データと基本的なRのプログラミング

基本的に私は、例えば、いくつかのデータを持っている:私は何をしたいか

ID | Data 
---------- 
1 | 20 
---------- 
2 | 30 
---------- 
3 | 25 
---------- 
4 | 26 
---------- 
5 | 88 
---------- 
6 | 65 
---------- 
7 | 70 
---------- 
8 | 30 
---------- 
9 | 15 
---------- 
10| 22 
---------- 

は次のとおりです。

  1. が3つの最初の観測
  2. は、これらの3つの観測
  3. の平均を計算します
  4. 別のマトリックスまたはデータフレームにそれ自身のIDで保存してください
  5. そしてoth 3つの観測。

したがって、私が15回の観測を行った場合、この例では5つしか終了しません。

ありがとうございました!

+2

RとのStackOverflowへようこそ!あなたはすでに試したことのいくつかの例を提供していれば、人々が多くのことを喜んで質問に答えるのを助けることができます。それで、そのことを念頭に置いて、これらの質問を解決する方法についてのあなたの最初の考えは何ですか?ここでのコメントではなく、質問に最もよく答えます。 – brittenb

+0

提案していただきありがとうございます@brittenb – Wolkuz

答えて

1

我々は%/%で変数をグループ化作成し、「データ」欄のmean

df1$grp <- (seq_len(nrow(df1))-1) %/%3 + 1 
aggregate(Data~grp, df1, FUN = mean) 
# grp  Data 
#1 1 25.00000 
#2 2 59.66667 
#3 3 38.33333 
#4 4 22.00000 

%/%は整数の除算を示し得るためにbase Rからaggregateを使用しています。我々は10

(1:10-1) %/% 3 + 1 
#[1] 1 1 1 2 2 2 3 3 3 4 

注の配列に整数除算を使用する場合、例えば、1が最後に追加されることが1ではなく0からグループスタートを行い、それだけで選択された

+0

OPはRの新機能です。あなたが '%/%'や数式表記のようなものを使っているかどうかを試してみてください。 – brittenb

1

同様のソリューションが、data.tableを使用しては次のようになります。あなたは新しい変数を作成する必要はありませんので、data.tablebyは表情がかかるため

library(data.table) 
setDT(df)[, mean(Data), by = .(((seq_len(nrow(df))-1) %/% 3) + 1)] 

# seq_len  V1 
#1:  1 25.00000 
#2:  2 59.66667 
#3:  3 38.33333 
#4:  4 22.00000 

これはいいです。 グループの計算のためにakrunに信用供与されます。


少し背景:data.frameから

data.table継承:

data.tableビネットから。ファイルリーダーとライター、集計、更新、等価、非等価、ローリング、レンジと間隔の結合を短く柔軟な構文で迅速に開発するために、高速でメモリ効率のよい方法を提供します。

data.tableは、data.framesとは非常に異なる構文を持つことができます。この例では、実行する計算(mean(Data))を指定してから、という式でグループ化するものをdata.tableと指定します。

ごとに1でインデックス付けされた数値ベクトルに評価されます。
((seq_len(nrow(df))-1) %/% 3) + 1 
[1] 1 1 1 2 2 2 3 3 3 4 

これは、上記の出力を返します。

データ:

df <- structure(list(ID = 1:10, Data = c(20L, 30L, 25L, 26L, 88L, 65L, 
     70L, 30L, 15L, 22L)), .Names = c("ID", "Data"), row.names = c(NA, 
     -10L), class = c("data.table", "data.frame"), .internal.selfref = <pointer: 0x00000000063e0788>) 
1

これを行う1つの方法は、最初のグループ化変数を作成することです。この変数は、我々のグループにデータセットsplitを与え、平均を見つけることを可能にする。その後、手段とそのIDを新しいデータフレームに組み込むことができます。

まず、グループ化変数から始めましょう。これを行うには、係数%%を利用します。

set.seed(9025) 
df = data.frame(id=1:10, values=sample(1:100, 10, FALSE)) 
df$group = df$id - (df$id %% -3) 

df 
    id values group 
1 1  85  3 
2 2  2  3 
3 3  93  3 
4 4  47  6 
5 5  90  6 
6 6  1  6 
7 7  27  9 
8 8  57  9 
9 9  81  9 
10 10  3 12 

ここで、グループ変数でsplitを指定することができます。

dl = split(df, df$group) 
dl 
$`3` 
    id values group 
1 1  85  3 
2 2  2  3 
3 3  93  3 

$`6` 
    id values group 
4 4  47  6 
5 5  90  6 
6 6  1  6 

$`9` 
    id values group 
7 7  27  9 
8 8  57  9 
9 9  81  9 

$`12` 
    id values group 
10 10  3 12 

splitちょうど私たちはそれを養う変数でデータフレームを分割します。したがって、最初のデータフレームはdfのサブセットにすぎず、df$groupは3になります。df$groupという実際の値は、使用しないので問題になりません。私たちは一度に3つの行を確実に取得する必要がありました。

次に、我々listオーバーだけループし、平均

means = unname(sapply(dl, function(x) mean(x$values), simplify=TRUE)) 
means 
60 46 55 3 

を計算し、最後に、私たちは新しいデータフレームにそれを回します。要約すると

n = length(means) 
new_df = data.frame(id=1:n, mean=means) 
new_df 
    id mean 
1 1 60 
2 2 46 
3 3 55 
4 4 3 

、アルゴリズムは次のようになります。

df$group = df$id - (df$id %% -3) 
dl = split(df, df$group) 
means = unname(sapply(dl, function(x) means(x$values), simplify=TRUE) 
n = length(means) 
new_df = data.frame(id=1:n, mean=means) 
関連する問題