1 回答
TA贡献1853条经验 获得超6个赞
本质上,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
一旦which应用,命名向量(即一维数组)的索引将根据逻辑返回。
which(apply(random_df, 2, var) > 900)
# num2
# 2
矩阵
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
熊猫
在 Python 中,使用pandas
(数据分析库),等效项也适用:DataFrame.apply
轴设置为index
在所有列上运行操作。等价地,您可以运行DataFrame.aggregate
. 返回是一个熊猫系列,类似于 R 的命名向量作为一维数组。
import numpy as np
import pandas as pd
np.random.seed(7312020)
random_df = pd.DataFrame({'num1': np.random.uniform(1, 100, 500),
'num2': np.random.uniform(1, 100, 500),
'num3': np.random.uniform(1, 100, 500),
'num4': np.random.uniform(1, 100, 500),
'num5': np.random.uniform(1, 100, 500)
})
agg1 = random_df.apply('var', axis='index')
print(agg1)
# num1 828.538378
# num2 810.755215
# num3 820.480400
# num4 811.728108
# num5 885.514924
# dtype: float64
agg2 = random_df.aggregate('var')
print(agg2)
# num1 828.538378
# num2 810.755215
# num3 820.480400
# num4 811.728108
# num5 885.514924
# dtype: float64
R可以通过简单的括号(在 R 中也是可行的),或(保持原始尺寸)which来实现:[...].locwhere
agg[agg > 850]
# num5 885.514924
# dtype: float64
agg.loc[agg > 850]
# num5 885.514924
# dtype: float64
agg.where(agg > 850)
# num1 NaN
# num2 NaN
# num3 NaN
# num4 NaN
# num5 885.514924
# dtype: float64
麻木的
另外使用 Python 的numpy(支持数组的数值计算库),您可以使用numpy.apply_along_axis. 并等同于 Pandas' 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]
添加回答
举报