我对R来说相当新,并且看起来应该是一个非常简单的程序。我有一个名为" Bottom"的数据框。包含列:"物种","类别"和" Y9:Y15" (表示2009-2015年。" Species"列包含鱼名,"类别"包含字母" B"一直向下表示底部鱼(这个数据框是从一个较大的数据框中取出的,有许多不同类别的鱼)和#34; Y9:Y15"包含第一栏中鱼类的价格:
Species Category Y9 Y10 Y11 Y12 Y13 Y14 Y15
Amberjack B 2.65 NA NA NA 3.00 NA 3.31
Ambon emperor B 2.62 2.63 NA NA 3.75 3.06 3.00
Bigeye bream B 2.62 2.21 2.86 NA 3.09 3.10 3.02
Bigeye scad B 3.33 NA 2.81 2.51 2.62 3.00 2.77
Bigeye trevally B 2.69 2.75 NA NA 3.73 3.22 3.00
Black jack B 2.66 2.52 2.55 3.00 3.75 3.26 3.42
我试图根据以下三个条件计算3个平均值:
1)所有鱼类的平均值为#34;石斑鱼"在名字里 2)所有鱼类的平均值为" snapper"在名字里 3)所有其他鱼类的平均值均不具备上述条件。
我发现我可以通过grepl为我的条件得到一个真或假的向量 :grepl("石斑鱼",Bottom $ Species)],但我还没弄明白如何将这个添加到一个函数中,告诉R根据" TRUE&#34计算平均值;矢量的值。
对此的任何建议将不胜感激。
谢谢!
答案 0 :(得分:1)
如果您不要求将平均值附加到原始数据框,则此处使用修改后的数据版本
a <- c("Amber jack", "Ambon emperor", "Bigeye bream", "Black jack")
b <- c(6, 4, 4, 1)
df <- data.frame(a, b)
显示
a b
1 Amber jack 6
2 Ambon emperor 4
3 Bigeye bream 4
4 Black jack 1
接下来使用来自dplyr的过滤器和你的grepl表达式来捕获鱼名
df %>%
filter(grepl("jack", df$a)) %>%
summarise(jackmean = mean(b))
返回
jackmean
1 3.5
非石斑鱼非鲷鱼意味着需要!在grepl面前
df %>%
filter(!grepl("jack", df$a)) %>%
summarise(notjackmean = mean(b))
给出
notjackmean
1 4