我有一个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的平均值。我怎么能这样做?
答案 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
tapply
按df$Average
的级别分割df$Serial_N
,然后在其上调用unique
,这会为每个组提供一个平均值,然后您可以{ {1}}并划分。 sum
添加了一列(相当于transform
)。