R命令“;其中(应用(数据,2,var)==0)“;用Python

R命令“;其中(应用(数据,2,var)==0)“;用Python,python,r,constants,variance,Python,R,Constants,Variance,我想知道如何编写R命令 which(apply(data, 2, var)==0) 。。。在Python中 现在,我正在尝试运行R脚本来执行PCA。 但是,pca()只接受非常量列(=方差不是0)。 例如,只有Col2可以接受为以下列中的非常量列: Col1 Col2 Col3 0.0 1.2 4.0 0.0 1.5 4.0 0.0 1.3 4.0 0.0 1.1 4.0 我以为我删除了所有常量列。 但是,我得到了一个错误: > Error in prcomp.defa

我想知道如何编写R命令

which(apply(data, 2, var)==0)
。。。在Python中

现在,我正在尝试运行R脚本来执行PCA。
但是,
pca()
只接受非常量列(=方差不是0)。
例如,只有Col2可以接受为以下列中的非常量列:

Col1 Col2 Col3
0.0  1.2  4.0
0.0  1.5  4.0
0.0  1.3  4.0
0.0  1.1  4.0
我以为我删除了所有常量列。
但是,我得到了一个错误:

> Error in prcomp.default(data, center = TRUE, scale = TRUE) : 
  cannot rescale a constant/zero column to unit variance
我在谷歌上搜索并找到了R命令解决方案:

which(apply(oopsmat, 2, var)==0)
这对我有用。该命令指定哪些列仍然是常量。
因此,我手动删除了列,R脚本进行了PCA

现在我想用Python做同样的事情。
如何用Python编写这个R命令

#####################################################

请不要阅读下面的内容,否则将浪费您的时间。
我将此作为我问了一个愚蠢问题的证据:

注意:这个R命令很奇怪。
正如我所说,我已经从数据中删除了所有常量列。
此R命令指示以下列的方差为0
(摘自大约50000份数据):

Excel的方差命令
VAR.p
的结果为231.4。
这甚至还不接近0
我不知道发生了什么,在Python中也找不到这样的命令。
所以,也请解释一下这种奇怪的行为


*我忽略了删除所有异常值的代码,这就是只剩下0的原因。

本质上,R中的
apply(data,2,var)
命令在二维结构上运行,如矩阵或数据帧(但不建议后者),以计算所有列的方差:

数据帧

set.seed(73120)

random_df <- data.frame(
  num1 = runif(500, 1, 100),
  num2 = runif(500, 1, 100),
  num3 = runif(500, 1, 100),
  num4 = runif(500, 1, 100),
  num5 = runif(500, 1, 100)
)

apply(random_df, 2, var)
#     num1     num2     num3     num4     num5 
# 822.9465 902.5558 782.4820 804.1448 830.1097 
矩阵

set.seed(73120)

random_mat <- replicate(5, runif(500, 1, 100))

apply(random_mat, 2, var)
# [1] 822.9465 902.5558 782.4820 804.1448 830.1097

which(apply(random_mat, 2, var) > 900)
# [1] 2
R的
,可通过简单括号
[…]
(也可在R中实现),
.loc
,或
,其中
(保留原始尺寸):

Numpy

另外,使用Python的
numpy
(支持数组的数字计算库),您可以使用。要与熊猫的
var
相等,请相应地调整默认
ddof

random_arry = random_df.to_numpy()

agg = np.apply_along_axis(lambda x: np.var(x, ddof=1), 0, random_arry)
print(agg)
# [828.53837793 810.75521479 820.48039962 811.72810753 885.51492378]

print(agg[agg > 850])
# [885.51492378]

本质上,R中的
apply(data,2,var)
命令在二维结构上运行,如矩阵或数据帧(但不建议后者),以计算所有列的方差:

数据帧

set.seed(73120)

random_df <- data.frame(
  num1 = runif(500, 1, 100),
  num2 = runif(500, 1, 100),
  num3 = runif(500, 1, 100),
  num4 = runif(500, 1, 100),
  num5 = runif(500, 1, 100)
)

apply(random_df, 2, var)
#     num1     num2     num3     num4     num5 
# 822.9465 902.5558 782.4820 804.1448 830.1097 
矩阵

set.seed(73120)

random_mat <- replicate(5, runif(500, 1, 100))

apply(random_mat, 2, var)
# [1] 822.9465 902.5558 782.4820 804.1448 830.1097

which(apply(random_mat, 2, var) > 900)
# [1] 2
R的
,可通过简单括号
[…]
(也可在R中实现),
.loc
,或
,其中
(保留原始尺寸):

Numpy

另外,使用Python的
numpy
(支持数组的数字计算库),您可以使用。要与熊猫的
var
相等,请相应地调整默认
ddof

random_arry = random_df.to_numpy()

agg = np.apply_along_axis(lambda x: np.var(x, ddof=1), 0, random_arry)
print(agg)
# [828.53837793 810.75521479 820.48039962 811.72810753 885.51492378]

print(agg[agg > 850])
# [885.51492378]

在R中,
apply
在数组上运行,在数据帧上运行(虽然不建议,但也可能)(请参见上的#1)。这些结构是R中内置的,但不是Python,因为其标准库不维护数组或数据帧。请标记并描述正在使用的Python模块。顺便提一下,
函数调用在R代码中是多余的。@Parfait OK,明白了。我接受你的回答。谢谢。在R中,
apply
在数组上运行,在数据帧上运行(虽然不明智,但可能)(请参见上的#1)。这些结构是R中内置的,但不是Python,因为其标准库不维护数组或数据帧。请标记并描述正在使用的Python模块。顺便提一下,
函数调用在R代码中是多余的。@Parfait OK,明白了。我接受你的回答。谢谢。这很好,只是它忘记了/违反了您自己的评论,因为您在data.frame上使用了
apply
。您可以在这里使用
sapply
/
vapply
(或者,因为重点是解释OP的代码,所以使用矩阵而不是数据帧)。谢谢@KonradRudolph,。是的,我确实在R数据帧上运行了
apply
,以显示对熊猫的翻译。但我不赞成这种做法,并编辑了开场白。这很好,只是它忘记了/违反了您自己给出的建议,因为您在data.frame上使用了
apply
。您可以在这里使用
sapply
/
vapply
(或者,因为重点是解释OP的代码,所以使用矩阵而不是数据帧)。谢谢@KonradRudolph,。是的,我确实在R数据帧上运行了
apply
,以显示对熊猫的翻译。不过,我不赞成这种做法,并编辑了开场白。
random_arry = random_df.to_numpy()

agg = np.apply_along_axis(lambda x: np.var(x, ddof=1), 0, random_arry)
print(agg)
# [828.53837793 810.75521479 820.48039962 811.72810753 885.51492378]

print(agg[agg > 850])
# [885.51492378]