2017-06-21 41 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)