【问题标题】:R Apply calculation on each row and column of data frameR对数据框的每一行和每一列应用计算
【发布时间】:2014-11-01 22:27:49
【问题描述】:

在数据框中,我想从该列的每个元素中减去每列的平均值。

示例数据框:

x <- c(1,2,3,4,5,6,7,8,9,10)
y <- c(2,3,2,3,2,3,2,3,2,3)
z <- c(100,200,300,400,500,600,700,800,900,1000)
df <- data.frame(x, y, z)

# get the mean of each column
mu <- colMeans(df)

我想我需要使用sapply,类似于:

df_norm <- df
df_norm[,1] <- sapply(df[,1], function(x) (x-mu[1]))
df_norm[,2] <- sapply(df[,2], function(x) (x-mu[2]))
df_norm[,3] <- sapply(df[,3], function(x) (x-mu[3]))

但我不知道如何编写 FUN 参数以在一行代码中执行此操作。

【问题讨论】:

    标签: r apply sapply


    【解决方案1】:
    sapply(df, function(x){x-mean(x)})
    

    【讨论】:

    • 现在我怎么没想到......!
    【解决方案2】:

    这是一种方法:

    do.call(cbind,lapply(df,function(col)col-mean(col)))
    #          x    y    z
    #  [1,] -4.5 -0.5 -450
    #  [2,] -3.5  0.5 -350
    #  [3,] -2.5 -0.5 -250
    #  [4,] -1.5  0.5 -150
    #  [5,] -0.5 -0.5  -50
    #  [6,]  0.5  0.5   50
    #  [7,]  1.5 -0.5  150
    #  [8,]  2.5  0.5  250
    #  [9,]  3.5 -0.5  350
    # [10,]  4.5  0.5  450
    

    【讨论】:

      【解决方案3】:

      要保持 data.frame 结构,您可以这样做:

      as.data.frame(Map(`-`, df, mu))
      

      sweep(df, 2, mu)
      

      还有scale 函数非常方便,但它确实将您的数据转换为矩阵:

      scale(df, center = TRUE, scale = FALSE)
      

      如果你不介意转换成矩阵,那么你也可以这样做:

      t(t(df) - mu)
      

      【讨论】:

      • 太好了,谢谢。我也完全忘记了矩阵操作。
      猜你喜欢
      • 1970-01-01
      • 2018-01-03
      • 2022-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-02
      • 2020-06-28
      • 1970-01-01
      相关资源
      最近更新 更多