2017-06-21 43 views
-5

我是新入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. 保存該成另一種矩陣或數據幀有自己的ID
  4. 並繼續OTH呃3觀察。

所以,如果我有15個觀察我只有5在這個例子中結束。

謝謝!

+2

歡迎R和StackOverflow的!如果你已經提供了一些你已經嘗試過的例子,你會發現人們非常樂意幫助你回答問題。所以,考慮到這一點,你如何解決這些問題最初的想法是什麼?問題中最好提供的答案,而不是這裏的評論。 – brittenb

+0

感謝您的建議@brittenb – Wolkuz

回答

1

我們創建分組變量與%/%並使用aggregatebase R拿到「數據」列

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 

mean%/%表示整數除法。例如,如果我們使用整數除法上的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是:

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 

這是不錯的,因爲data.tableby需要表達,所以你並不需要創建一個新的變量。 Credit用於計算組的akrun。


一點背景:

data.table小插曲:

從data.frame data.table繼承。它提供了快速,高效的nemory:文件讀寫器,聚合,更新,相等,不相等,軋件,範圍和區間連接,在很短的和靈活的語法,爲更快的發展。

data.table的語法可能與data.frames的語法非常不同。在這種情況下,我們指定我們要執行(該mean(Data)),然後我們也告訴data.table什麼組通過計算 - 在這種情況下,表達((seq_len(nrow(df))-1) %/% 3) + 1,其評估的是由1每4個元素索引的數值向量:

((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

的一種方式做,這是首先創建一個分組變量。這個變量將允許我們將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的實際值並不重要。我們只需要確保一次獲得三排。

接下來,我們只是在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)