【问题标题】:Applying pnorm to columns of a data frame将 pnorm 应用于数据框的列
【发布时间】:2010-11-17 18:57:32
【问题描述】:

我正在尝试规范化数据框中的一些数据。我想获取每个值并通过 pnorm 函数以及该值所在列的平均值和标准差运行它。使用循环,我将如何写出我想要做的事情:

#example data
hist_data <- data.frame( matrix( rnorm( 200,mean=5,sd=.5 ),nrow=20 ) )

n <- dim( hist_data )[2] #columns=10
k <- dim( hist_data )[1] #rows   =20

#set up the data frame which we will populate with a loop
normalized <- data.frame( matrix( nrow = nrow( hist_data ), ncol = ncol( hist_data ) ) )

#hot loop in loop action
for ( i in 1:n ){
   for ( j in 1:k ){
      normalized[j,i] <- pnorm( hist_data[j,i], 
                                mean = mean( hist_data[,i] ), 
                                sd = sd( hist_data[,i] ) )
   }  
}
normalized

似乎在 R 中应该有一个方便的花花公子矢量方式来做到这一点。我以为我很聪明,所以尝试使用 apply 功能:

#trouble ahead
hist_data <- data.frame( matrix( rnorm( 200, mean = 5,sd = .5 ), nrow=10 ) )
normalized <- apply( hist_data, 2, pnorm, mean = mean( hist_data ), sd = sd( hist_data ) )
normalized

令我非常懊恼的是,这并没有达到我的预期。输出的左上角和右下角元素是正确的,但仅此而已。那么我怎样才能让我的生活去循环呢?

如果你能告诉我我的第二个代码块实际上在做什么,那就加分。对我来说还是个谜。 :)

【问题讨论】:

  • 在您的示例代码中,单词 rows 和 columns 在 cmets 中是颠倒的。此外,您定义变量 n 和 k 来保存列和行,然后无法在 matrix 命令中使用它们。可能想清理一下,以免其他人感到困惑。
  • 措辞倒退的好处。但是对于n和k,它们用在“for (i in 1:n)”和“for (j in 1:k)”中
  • 对。错过了第二部分。好帖子!

标签: r loops apply


【解决方案1】:

你想要:

normalize <- apply(hist_data, 2, function(x) pnorm(x, mean=mean(x), sd=sd(x)))

问题是您将单个列传递给 pnorm,但整个 hist_data 传递给均值和标准差。

正如我在推特上提到的,我不是统计员,所以我无法回答任何关于你实际尝试做的事情 :)

【讨论】:

    猜你喜欢
    • 2020-03-23
    • 2019-06-01
    • 2021-03-20
    • 2014-09-25
    • 1970-01-01
    • 1970-01-01
    • 2020-04-24
    相关资源
    最近更新 更多