当前位置: 首页 > 知识库问答 >
问题:

如何使用 data.table 计算某些条件下不同列的平均值和中位数,并使用 R 聚合

暨弘懿
2023-03-14

我有四个向量(列)

 x y z  t
 1 1 1 10
 1 1 1 15
 1 4 1 14
 2 3 1 15
 2 2 1 17
 2 1 2 19
 2 4 2 18
 2 4 2 NA
 2 2 2 45
 3 3 2 NA
 3 1 3 59
 4 3 3 23
 4 4 3 45
 4 4 4 74
 5 1 4 86

我知道如何计算x、y和z中每个值的向量t的平均值和中值。例子是:

   bar <- data.table(expand.grid(x=unique(data[x %in% c(1,2,3,4,5),x]),
                                 y=unique(data[y %in% c(1,2,3,4),y]),
                                 z=unique(data[z %in% c(1,2,3,4),z])))
   foo <- data[z %in% c(1,2,3,4),list(
    mean.t=mean(t,na.rm=T),
    median.t=median(t,na.rm=T))
   ,by=list(x,y,z)]
   merge(bar[,list(x,y,z)],foo,by=c("x","y","z"),all.x=T)

结果是:

     x y z mean.t median.t
  1: 1 1 1   12.5     12.5
  2: 1 1 2     NA       NA
  3: 1 1 3     NA       NA
  4: 1 1 4     NA       NA
  5: 1 2 1     NA       NA
  ........................
  79: 5 4 3    NA       NA
  80: 5 4 4    NA       NA

但现在我有一个问题:如何对x,y,z和t做同样的计算,但z不是从1到4的数字,而是像这样的组:

  if 0 < z <= 2 group I, 
  if 2 < z <= 3 group II and 
  if 3 < z <= 4 group III.

因此,输出应采用如下格式:

     x y z    mean.t median.t
  1: 1 1 I   
  2: 1 1 II     
  3: 1 1 III     
  4: 1 2 I     
  5: 1 2 II     
  6: 1 2 III     
  7: 1 3 I     
  8: 1 3 II     
  9: 1 3 III     
 10: 1 4 I  
 ..........

共有1个答案

宗政永望
2023-03-14

定义一个新列,即要作为分组依据的 zGroup

(这个例子中的数据和你的有点不一样)

#create some data
dt<-data.table(x=rep(c(1,2),each=4),
               y=rep(c(1,2),each=2,times=2),
               z=rep(c(1,2,3,4),times=2),t=1:8)

#add a zGroup column
dt[0<z & z<=2, zGroup:=1]
dt[2<z & z<=3, zGroup:=2]
dt[3<z & z<=4, zGroup:=3]

#group by unique combinations of x, y, zGroup taking mean and median of t
dt[,list(mean.t=mean(t), median.t=as.double(median(t))), by=list(x,y,zGroup)]

请注意,如果不将中值强制为双精度值,这将会出错。详情见本帖。

 类似资料:
  • 我想使用dplyr::mutate计算一些列的平均值。 我想包含来计算平均值的列只有BL1到BL9,所以我这样做了。 这行不通。我注意到如果我一个接一个的列,它会工作 我怀疑这是因为我给出的是字符串而不是“列”。 有人能解释这种行为吗?对此最好的解决办法是什么?

  • 我一直在尝试编写一些代码来使用MapReduce查找数字的平均值。 我尝试使用全局计数器来实现我的目标,但是我无法在映射器的< code>map方法中设置计数器值,也无法在缩减器的< code>reduce方法中检索计数器值。 我是否必须在< code>map中使用全局计数器(例如,通过使用所提供的< code>Reporter的< code>incrCounter(key,amount))?或者

  • 我有一个大的数据帧,显示如下: 基本上,每当写完“状态”时,我都想根据“类型”计算平均值和中位数。到目前为止,我所做的是首先根据状态“完成”创建一个组,然后计算组的平均值和中位数,如下所示: 如何为“类型”添加一个参数,以便脚本也将根据“类型”估计每个组的中位数。 谢谢。

  • 在此输入图像描述 你好,我刚刚了解了Javascript函数,想知道在JS中使用数组和函数找出平均值的方法。我已经链接了我的代码截图,你能帮我吗?

  • 我想在第一个光栅中选择一个小区域,计算该区域的空间平均值,并对其他11个光栅执行相同的操作。最终将得到12个值。 我试过这个: 这样做对吗? 那么我如何计算所选区域的空间平均值?并对所有其他光栅执行相同的操作。提前谢谢。

  • 我有一个由66个变量的10299个观测值组成的数据框。其中一些变量共享一个通用的列名,我想计算每个观测值的这些变量的平均值。 具有以下矩阵,列名: 我想得到: 我尝试了循环,命令,但没有得到所需的结果。 抱歉,如果这个问题看起来太基本了,我已经在谷歌上查过可能的解决方案,但没有找到任何解决方案。