对于多列,基于另一列中包含的单词的一列的条件均值

时间:2017-04-06 19:50:31

标签: r

我对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计算平均值;矢量的值。

对此的任何建议将不胜感激。

谢谢!

1 个答案:

答案 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