【问题标题】:Conditional mean of one column based on words contained in another column, for multiple columns基于另一列中包含的单词的一列的条件平均值,用于多列
【发布时间】:2017-09-02 00:54:14
【问题描述】:

我对 R 相当陌生,并且在看起来应该是一个非常简单的过程时遇到了一些困难。我有一个名为“底部”的数据框,其中包含以下列:“物种”、“类别”和“Y9:Y15”(表示 2009-2015 年。“物种”列包含鱼名,“类别”包含字母“ B" 一直向下表示底鱼(这个数据框是从一个有许多不同种类的鱼的较大的数据框中取出的)和 "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) 名称中带有“石斑鱼”的所有鱼类的平均值 2)名称中带有“鲷鱼”的所有鱼类的平均值 3) 不具备上述条件的所有其他鱼类的平均值。

我发现我可以使用 grepl 获得适合我的条件的真或假向量 : grepl("grouper",Bottom$Species)],但我还没有想出如何将它添加到一个函数中,告诉 R 根据向量的“TRUE”值计算平均值。

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

谢谢!

【问题讨论】:

  • 试试mean( Bottom[ grepl("grouper", Bottom$Species), -(1:2)] )
  • 我尝试使用它,但由于我的数据有 NA,它给了我这个:mean( Bottom[ grepl("grouper", Bottom$Species), -(1:2)] ) 警告消息:在 mean.default(Bottom[grepl("grouper", Bottom$Species), -(1:2)]) 中:参数不是数字或逻辑:返回 NA 我尝试添加 na.rm=TRUE, (mean( Bottom [ grepl("grouper", Bottom$Species), -(1:2)], na.rm=TRUE ) 但它给了我同样的错误。

标签: r


【解决方案1】:

如果您不需要将平均值附加到原始数据框,这里有一个使用修改后的数据版本的示例

a <- c("Amber jack", "Ambon emperor", "Bigeye bream", "Black jack")
b <- c(6, 4, 4, 1)

df <- data.frame(a, b)

df 显示

              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

【讨论】:

  • 谢谢@JPHwang。我将它用于我的整个数据框,底部 %>% filter(grepl("grouper", Bottom$Species)) %>% summarise(groupermean = mean(Y9),但它给了我这个错误:错误:is.data。 frame(.data) || is.list(.data) || is.environment(.data) 不是 TRUE。此外,是否可以获得整行的平均值(对于每个年份变量),或者我会必须单独获取手段,然后将它们组合成一行?
  • 我想知道这是否与我的 R studio 版本有关 - 我也尝试了代码和您的修改版本,并得到了同样的错误。
  • 一旦我下载了 tidyverse 包,它就可以工作了。尽管由于列中的 NA,我得到了 NA 的平均值。我尝试添加 na.rm=TRUE:Bottom %&gt;% filter(grepl("grouper", Bottom$Species)) %&gt;% summarise(groupermean = mean(Y9), na.rm=TRUE),但我只是得到一个名为 na.rm 的新列,下面有 TRUE
  • 我刚刚发现了我的问题 - 我在函数的错误位置添加了 na.rm=TRUE。更正:Bottom %&gt;% filter(grepl("grouper", Bottom$Species)) %&gt;% summarise(groupermean = mean(Y9,na.rm=TRUE) ) .
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-07
  • 1970-01-01
  • 1970-01-01
  • 2015-04-11
  • 1970-01-01
  • 1970-01-01
  • 2021-10-02
相关资源
最近更新 更多