在不使用for循环的情况下计算R dataFrame单元格的值

时间:2016-03-22 19:06:05

标签: r dataframe

我有一个R dataFrame,其中包含以下内容:

Serial N         year         current    Average 
   B              10            14          15
   B              10            16          15
   C              12            13          12
   D              40            20          20
   B              11            15          15
   C              12            11          12

我希望根据唯一序列号的平均值创建一个新列。我希望有类似的东西:

Serial N         year         current    Average      temp 
   B              10            14          15        (15+12+20)/15
   B              10            16          15        (15+12+20)/15
   C              12            13          12        (15+12+20)/12
   D              40            20          20        (15+12+20)/20
   B              11            15          15        (15+12+20)/15
   C              12            11          12        (15+12+20)/12

temp列是每个序列N(对于B,C和D)的平均值与该行的平均值的相加。如何在不使用for循环的情况下计算它,因为行1,2和5(序列号N:B)在平均列和温度方面是相同的?我从这开始:

for (i in unique(df$Serial_N))
   {
       .........
    }     

但我卡住了,因为我还需要其他Serial N的平均值。我怎么能这样做?

3 个答案:

答案 0 :(得分:3)

例如,您可以尝试以下内容(假设您的计算匹配):

df$temp <- sum(tapply(df$Average, df$SerialN, mean)) / df$Average

结果输出:

  SerialN year current Average     temp
1       B   10      14      15 3.133333
2       B   10      16      15 3.133333
3       C   12      13      12 3.916667
4       D   40      20      20 2.350000
5       B   11      15      15 3.133333
6       C   12      11      12 3.916667

答案 1 :(得分:3)

使用unique.data.frame()可以避免在不同群组之间重复Average

df$temp <- sum((unique.data.frame(df[c("Serial_N","Average")]))$Average) / df$Average

答案 2 :(得分:1)

在基础R中,您可以使用

df <- transform(df, temp = sum(tapply(df$Average, df$Serial_N, unique))/df$Average)

df$temp <- sum(tapply(df$Average, df$Serial_N, unique))/df$Average

这两个都会给你

df
#   Serial_N year current Average     temp
# 1        B   10      14      15 3.133333
# 2        B   10      16      15 3.133333
# 3        C   12      13      12 3.916667
# 4        D   40      20      20 2.350000
# 5        B   11      15      15 3.133333
# 6        C   12      11      12 3.916667

tapplydf$Average的级别分割df$Serial_N,然后在其上调用unique,这会为每个组提供一个平均值,然后您可以{ {1}}并划分。 sum添加了一列(相当于transform)。