【问题标题】:creating z-scores for subset of rows为行子集创建 z 分数
【发布时间】:2012-02-24 05:56:53
【问题描述】:

我是 R 编程新手,在一些基本代码方面遇到了麻烦。

我有一个包含以下列的数据框:条件(因子)、用户(因子)和灵敏度(整数)。每个用户有 20 个敏感度项。我需要为每个用户创建一个具有标准化敏感度分数的新列。这样我就可以比较不同用户的敏感度分数。我在编写可以为每个用户的每个项目创建 z 分数的循环(或类似的东西)时遇到问题。

我有 14 个唯一用户(这将增加),其中包含 20 个敏感项。

谢谢。

【问题讨论】:

  • 你能举个例子吗?您想要给定仪器上每个用户的 z 分数,还是想要将每个项目的 z 分数与其他项目进行比较?无论哪种情况,每个用户都有 20 列。您可以以某种方式将它们组合起来,但如何做到这一点取决于数据的含义。

标签: r


【解决方案1】:

我会看看plyr 包。除非我弄错了,我经常这样,scale 是您正在寻找的功能。如果您的数据位于data.frame df:

library(plyr)
ddply(df, .(user), function(x){x$scaled.sensitivity = scale(x$sensitivity)
                               return(x)})

【讨论】:

  • 嗨,我刚刚在下面发布了我的问题。同样的问题,我得到了很多 NaN
  • @user1229433 您应该返回数据源并找出为什么您希望为数字的列不是。如果您尝试缩放所有相同数字的向量(即标准偏差为零),您应该只得到NaN
【解决方案2】:

在这种情况下不需要循环。改为使用矢量化。让我们考虑以下模拟数据:(不确定它会完全重现您的数据集,但希望您能大致了解)

dfrm <- data.frame(cond=gl(2, 1, 100, labels=LETTERS[1:2]), 
                   user=gl(50, 2, labels=paste("id", 1:20, sep="")), 
                   sensitivity=runif(100, 1, 5))

计算 z 分数很简单

dfrm$z.sensitivity <- scale(dfrm$sensitivity)

如果您希望 z 分数以 cond 为条件,那么您可以选择任一方法

with(dfrm, tapply(sensitivity, cond, scale))

或者,使用plyr

ddply(dfrm, c("cond"), transform, sensitivity.z = scale(sensitivity))

【讨论】:

  • 您好,感谢您的回复。这可行,但它给出了大 z 分数(对于所有用户组合) dfrm$z.sensitivity
猜你喜欢
  • 2011-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-04
  • 1970-01-01
  • 1970-01-01
  • 2015-11-29
  • 1970-01-01
相关资源
最近更新 更多