【问题标题】:Considering only rows with certain value in a column in R仅考虑 R 中列中具有特定值的行
【发布时间】:2019-02-12 15:11:25
【问题描述】:

我有一个看起来像这样的矩阵

1 2 8 
2 2 9
3 1 10
4 5 10
5 2 12

现在我想在第二列中具有特定值的行的第三列上应用一些函数。因此,例如,我只想考虑第二列中有2 的行。然后我想得到 8,9,12 的均值、中位数和方差。

实际上我的矩阵更大,但这是基本思想。我想我需要一个函数,它首先检查第二列中的值,然后只考虑与给定值对应的第三列的值。我做了这样的东西,但它只适用于平均值,实际上是一种浪费,因为该功能已经内置在 R 中。

看起来是这样的:

average<- function(m){
  k=0
   for (i in 1:nrow(x)){
     if(x[i,2]==m){
       k = k + x[i,3]
     } else {NULL}
     amount <- sum(x[,2]==m)
  }
   av <- k/amount
  return(av)}

【问题讨论】:

  • 你能不能转换成数据框然后只使用dplyr函数?那里会有几个不同的选项......例如filter()group_by()summarise()。同样,如果您想学习data.table,这对于您想要的最终结果将很有用。

标签: r function matrix


【解决方案1】:
mat <- matrix(c(1:5, 2,2,1,5,2, 8,9,10,10,12), ncol = 3)

mean(mat[, 3][which(mat[, 2] == 2)])

从内到外,首先确定对应于第二列中的哪一列 = 2 which(mat[, 2] == 2) 的索引。然后,将第 3 列子集到具有mat[, 3][...] 的那些索引,最后取它们的mean()

【讨论】:

  • 很好,完美。您能否确认将mean 更改为var 会给我带来差异?
  • 是的,将 mean 更改为 var 会给您提供第 3 列的方差,其中第 2 列 == 2。但是,根据您的问题,您最好将所有内容都放入data.frame(而不是矩阵),然后使用 dplyr 等包来快速处理这些“过滤”和“汇总”功能。
【解决方案2】:

类似mean(subset(df,column2name==2)[,3])?
还是mean(df$column3name[df$column2name==2])

对于纯矩阵mean(df[df[,2]==2,3])

【讨论】:

  • 不太确定它如何与 column2name 语句一起使用。我收到一个错误,它找不到该对象。
  • @Mathbeginner column2name 是您的第二列的名称,如果不存在这样的名称,请参阅编辑。
猜你喜欢
  • 2014-02-18
  • 2022-01-27
  • 1970-01-01
  • 2012-03-19
  • 2014-03-23
  • 1970-01-01
  • 2021-10-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多