繁体   English   中英

在 dplyr 中查找多列的平均值……为什么我得到一个重复的值?

[英]Find the mean of multiple columns in dplyr… why am I getting a repeated value?

我有一个 object x

x <- structure(list(ID = c("id1", "id2", "id3", "id4", 
"id5", "id6"), FC_C1 = c(1.0237284417215, -1.17547380888546, 
1.24032256483382, -1.26788878671502, -1.02667652234543, 1.08328144665509
), FC_C2 = c(-1.05037736352335, -1.51035519579208, 1.73843567887288, 
-1.06460883435243, -1.1937810921512, 1.32473926867105), FC_C3 = c(-1.04105748916685, 
-1.10813259308926, 1.33943213640751, -1.08323491305538, 1.0928771895575, 
1.20931550695441)), row.names = c(NA, 6L), class = "data.frame")

> x
   ID     FC_C1     FC_C2     FC_C3
1 id1  1.023728 -1.050377 -1.041057
2 id2 -1.175474 -1.510355 -1.108133
3 id3  1.240323  1.738436  1.339432
4 id4 -1.267889 -1.064609 -1.083235
5 id5 -1.026677 -1.193781  1.092877
6 id6  1.083281  1.324739  1.209316

我想要一个名为FC_average的新列,它是前三列(每行)的平均值。

但是,当我运行这个 function 时:

meta_x <- x %>% 
    dplyr::mutate(
        FC_average = mean(c(
            FC_C1,
            FC_C2,
            FC_C3)
        ))

我明白了:

> meta_x
   ID     FC_C1     FC_C2     FC_C3  FC_average
1 id1  1.023728 -1.050377 -1.041057 -0.08163635
2 id2 -1.175474 -1.510355 -1.108133 -0.08163635
3 id3  1.240323  1.738436  1.339432 -0.08163635
4 id4 -1.267889 -1.064609 -1.083235 -0.08163635
5 id5 -1.026677 -1.193781  1.092877 -0.08163635
6 id6  1.083281  1.324739  1.209316 -0.08163635

为什么FC_average列没有找到每行的平均值?

我们可以使用向量化的rowMeans代替mean

library(dplyr)
x %>% 
    mutate(FC_average = rowMeans(select(., starts_with('FC'))))

apply()可用于跨行或列迭代任何 function。 如果你想要每一行的平均值,你可以使用这个代码:

apply(x[,2:4], 1,mean) -> x$FC_average

如果出于某种原因您想要列的意思,您可以将 1 更改为 2,如下所示:

apply(x[,2:4], 2, mean)

在您的代码中,您要求mutate() x 使用一个单一值的新列——这三列的平均值,或 -0.08163635。 以下是如何将现有代码与rowwise()一起使用

x %>% 
  rowwise(.) %>% dplyr::mutate(
    FC_average = mean(c(
      FC_C1,
      FC_C2,
      FC_C3)
    ))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM