【问题标题】:Row based summary calculations基于行的汇总计算
【发布时间】:2012-10-12 18:16:42
【问题描述】:

xx

head(xx,1)
     Sport    variable 2012.07.01 2012.07.02 2012.07.03 2012.07.04 2012.07.05 2012.07.06 2012.07.07 2012.07.08 2012.07.09 2012.07.10 2012.07.11 2012.07.12 2012.07.13 2012.07.14 2012.07.15 2012.07.16 2012.07.17
1 Soccer Likes         13         13         14         12         11         11         NA          9         16         11         12         15         10         NA         13          9         10
  2012.07.18 2012.07.19 2012.07.20 2012.07.21 2012.07.22 2012.07.23 2012.07.24 2012.07.25 2012.07.26 2012.07.27 2012.07.28 2012.07.29 2012.07.30 2012.07.31 2012.08.01 2012.08.02 2012.08.03 2012.08.04 2012.08.05
1         16         10         17         NA         10         15         14         11         11         13         NA         13         26        987        898        162        146         NA        257
  2012.08.06 2012.08.07 2012.08.08 2012.08.09 2012.08.10 2012.08.11 2012.08.12 2012.08.13 2012.08.14 2012.08.15 2012.08.16 2012.08.17 2012.08.18 2012.08.19 2012.08.20 2012.08.21 2012.08.22 2012.08.23 2012.08.24
1        370        443        490        612        646         NA        311        371        432        512        610        734         NA       1002        931        886        190        317        386
  2012.08.25 2012.08.26 2012.08.27 2012.08.28 2012.08.29 2012.08.30 2012.08.31 2012.09.01 2012.09.02 2012.09.03 2012.09.04 2012.09.05 2012.09.06 2012.09.07 2012.09.08 2012.09.09 2012.09.10 2012.09.11 2012.09.12
1         NA        586        812        904        863        941        922         NA        150        146        175        132        254        330         NA        198        281        254        316
  2012.09.13 2012.09.14 2012.09.15 2012.09.16 2012.09.17 2012.09.18 2012.09.19 2012.09.20 2012.09.21 2012.09.22 2012.09.23 2012.09.24 2012.09.25 2012.09.26 2012.09.27 2012.09.28 2012.09.29 2012.09.30 2012.10.01
1        416        594         NA        668        745        972        984        885        496         NA        687        734        767        832        965        934         NA        200        225
  2012.10.02 2012.10.03 2012.10.04 2012.10.05 2012.10.06 2012.10.07 2012.10.08 2012.10.09 2012.10.10 2012.10.11       SD Mean        Max   Min mean
1        219        181        198        229         NA        364        431        492        592        612 336.9102   NA soccer     9   NA

尝试使用以下公式计算每行的行标准差、平均值、最大值、最小值等:

transform(xx, SD=apply(xx,1, sd, na.rm = TRUE)) 
transform(xx, Mean=apply(xx,1, mean, na.rm = TRUE)) 
transform(xx, Max=apply(xx,1, max, na.rm = TRUE)) 
transform(xx, Min=apply(xx,1, min, na.rm = TRUE)) 

我认为这不起作用,因为我的前两列是文本而不是所有数字。

有没有办法只在基于行的计算中计算数字?

【问题讨论】:

  • 从 R 发布输出时,尝试设置 options(width = 70) 或一些类似的小数字以避免代码块中发生的换行。

标签: r


【解决方案1】:

您可以使用[ 选择相关变量,如下所示:

set.seed(007)
X <- data.frame(matrix(sample(c(10:20, NA), 100, replace=TRUE), ncol=10))
sex <- sample(c('F', 'M'), 10, T)
reg <- sample(c('N', 'S', 'E', 'W'), 10, T)
DF <- cbind(sex, reg, X)
DF # this is your data.frame
       sex reg X1 X2 X3 X4 X5 X6 X7 X8 X9 X10
1    F   E NA 12 17 18 19 16 12 13 20  14
2    F   S 14 12 13 13 14 18 16 17 20  10
3    F   N 11 19 NA 12 19 19 19 20 12  20
4    F   E 10 11 20 12 15 17 18 17 18  12
5    M   E 12 15 NA 14 20 18 16 11 14  18
6    F   E 19 11 10 20 13 14 17 16 10  16
7    M   E 14 16 17 15 10 11 15 15 11  16
8    F   W NA 10 15 19 19 12 15 15 19  14
9    M   N 11 NA NA 20 20 14 14 17 14  19
10   F   W 15 13 14 15 NA 13 15 NA 15  12

如您所见,第一个变量是非数字的。使用sapply(DF, class) 来查看。

现在使用上面提到的[,你可以选择所有的数值变量

DF[,-c(1,2)] # selecting all variables but 1 and 2

您现在可以对这些变量执行计算

transform(DF, SD=apply(DF[,-c(1,2)],1, sd, na.rm = TRUE))  # and so on
   sex reg X1 X2 X3 X4 X5 X6 X7 X8 X9 X10       SD
1    F   E NA 12 17 18 19 16 12 13 20  14 3.041381
2    F   S 14 12 13 13 14 18 16 17 20  10 3.020302
3    F   N 11 19 NA 12 19 19 19 20 12  20 3.865805
4    F   E 10 11 20 12 15 17 18 17 18  12 3.496029
5    M   E 12 15 NA 14 20 18 16 11 14  18 2.958040
6    F   E 19 11 10 20 13 14 17 16 10  16 3.596294
7    M   E 14 16 17 15 10 11 15 15 11  16 2.449490
8    F   W NA 10 15 19 19 12 15 15 19  14 3.201562
9    M   N 11 NA NA 20 20 14 14 17 14  19 3.356763
10   F   W 15 13 14 15 NA 13 15 NA 15  12 1.195229

另一种选择是:

newDF <- DF[,sapply(DF, is.numeric)]
transform(DF, SD=apply(newDF,1, sd, na.rm = TRUE))
   sex reg X1 X2 X3 X4 X5 X6 X7 X8 X9 X10       SD
1    F   E NA 12 17 18 19 16 12 13 20  14 3.041381
2    F   S 14 12 13 13 14 18 16 17 20  10 3.020302
3    F   N 11 19 NA 12 19 19 19 20 12  20 3.865805
4    F   E 10 11 20 12 15 17 18 17 18  12 3.496029
5    M   E 12 15 NA 14 20 18 16 11 14  18 2.958040
6    F   E 19 11 10 20 13 14 17 16 10  16 3.596294
7    M   E 14 16 17 15 10 11 15 15 11  16 2.449490
8    F   W NA 10 15 19 19 12 15 15 19  14 3.201562
9    M   N 11 NA NA 20 20 14 14 17 14  19 3.356763
10   F   W 15 13 14 15 NA 13 15 NA 15  12 1.195229

我更喜欢最后一个,因为您不必知道哪个变量是数字,R 会为您选择它们​​。

编辑

这将是一个更好的方法

为基本统计定义一个函数

  Stats <- function(x){
      Mean <- mean(x, na.rm=TRUE)
      SD <- sd(x, na.rm=TRUE)
      Min <- min(x, na.rm=TRUE)
      Max <- max(x, na.rm=TRUE)
      return(c(Mean=Mean, SD=SD, Min=Min, Max=Max))
    }

    cbind(DF, t(apply(newDF,1, Stats))) # Where newDF is define as above 
   sex reg X1 X2 X3 X4 X5 X6 X7 X8 X9 X10     Mean       SD Min Max
1    F   E NA 12 17 18 19 16 12 13 20  14 15.66667 3.041381  12  20
2    F   S 14 12 13 13 14 18 16 17 20  10 14.70000 3.020302  10  20
3    F   N 11 19 NA 12 19 19 19 20 12  20 16.77778 3.865805  11  20
4    F   E 10 11 20 12 15 17 18 17 18  12 15.00000 3.496029  10  20
5    M   E 12 15 NA 14 20 18 16 11 14  18 15.33333 2.958040  11  20
6    F   E 19 11 10 20 13 14 17 16 10  16 14.60000 3.596294  10  20
7    M   E 14 16 17 15 10 11 15 15 11  16 14.00000 2.449490  10  17
8    F   W NA 10 15 19 19 12 15 15 19  14 15.33333 3.201562  10  19
9    M   N 11 NA NA 20 20 14 14 17 14  19 16.12500 3.356763  11  20
10   F   W 15 13 14 15 NA 13 15 NA 15  12 14.00000 1.195229  12  15

【讨论】:

  • @Jiber,感谢您的帮助。对此,我真的非常感激。这适用于 SD,我认为同样适用于平均值、最大值、最小值?
  • 帮助很大,哇。 R 有这么多,可能会非常令人沮丧。
  • 我还有一个问题,我保证不会打扰你。现在,我有一堆不同日期的标题,下面是与日期有关的值。我计算了平均值,标准差。我想计算每个单元格的异常值。将每个单元格与 sd 进行比较,我该怎么做?
  • 你可以把它作为一个新问题,向我们展示你到目前为止所做的尝试,但是,粗略地说,如果你想使用 SD 来比较值并找出异常值,你可以设置一个阈值如果是这种情况,单个观察值可能会被视为异常值,ifelsesweep 将是不错的选择。
【解决方案2】:
summary(t(xx))

summary()可以按列获取统计信息,因此使用t()

【讨论】:

  • 接受的答案要长得多,你确定这是一个完整的答案吗?你能解释一下它是如何工作的吗?谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-08
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 2020-01-02
  • 2022-01-27
相关资源
最近更新 更多