不使用for循环计算R数据帧单元的值

不使用for循环计算R数据帧单元的值,r,dataframe,R,Dataframe,我有一个包含以下内容的R数据帧: Serial N year current Average B 10 14 15 B 10 16 15 C 12 13 12 D 40 20

我有一个包含以下内容的R数据帧:

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))
   {
       .........
    }     

但是我被卡住了,因为我还需要其他序列N的平均值。我如何才能做到这一点?

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


在base R中,您可以使用

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

tapply
df$Average
df$Serial\N
的级别进行拆分,然后对其调用
unique
,这将为每个组提供一个平均值,然后您可以对其进行
求和
和除
transform
添加一列(相当于
dplyr::mutate
)。

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

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

df$temp您可以使用库
dplyr
和分组来实现您想要的。但是,我不清楚你是如何得到这些数字(15+12+20)/15的。你能更新问题以反映输入数据的正确值吗?15是序列N(B)的平均值,12是序列N(C)的平均值,20是序列N(C)的平均值,/15是序列N(B)的平均值,我想他的意思是
sum(unique(df$Average))/Average
(假设不同组之间没有重复平均值…有更彻底的方法)如果我想访问平均值(对于每个唯一的序列N)?
sum(tapply(df$Average,df$Serial\u N,unique))会发生什么/Average
,也许吧,不过必须有一个更简单的方法。根据更新和澄清,我同意。这是正确的方法。如果我想访问Average(每个唯一的序列号N),会发生什么?既然有相同的,我如何访问每个序列号(序列号B、C和D)这就是
tapply
给你的;你可以对结果进行索引,得到一个平均值。或者如果你愿意,可以使用里斯的
unique(df[,c(“Serial_N”,“average”))
。我明白你的意思,谢谢。但是让我重新表述一下我的意思,我想使用每个平均值(unique))作为另一个函数的输入(我不想通过每个循环使用循环,因为我有大约10000个不同的序列N,每个序列N都有一个平均值。我可以使用您提到的方法得到唯一的序列N和平均值,但是我如何在没有循环的情况下使用每个平均值(使用每个序列N作为另一个函数的输入)?将
tapply
或其他内容的结果保存到一个变量中,并将该变量作为输入传递。或者直接传递
tapply
。您几乎总是可以在R中传递一个值向量;出于这种目的,不需要循环。我这样做了:temp=unique(df[,c(“Serial_N”,“Average”)),然后我做了这个temp$new_set=tapply(temp$Average,函数(x){2*pnorm(x*sqrt(2))-1})。因此,对于每个值(平均值的唯一值),我希望应用该函数。我在unique.default(x)unique()中得到了erro:r错误仅适用于向量使用
unique
!不过,您实际上不需要指定
.data.frame
方法,因为如果您将data.frame传递给它,它将被调用。此外,您可能在
c之前有一个
(…
显示您想要所有行;它按原样工作,但最好是彻底。
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
df$temp <- sum((unique.data.frame(df[c("Serial_N","Average")]))$Average) / df$Average