不使用for循环计算R数据帧单元的值
我有一个包含以下内容的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
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