1 回答

TA貢獻(xiàn)1853條經(jīng)驗 獲得超6個贊
本質(zhì)上,R 中的命令apply(data, 2, var)在二維結(jié)構(gòu)(如矩陣或數(shù)據(jù)幀)上運行(但不建議后者)以計算所有列的方差:
數(shù)據(jù)框
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應(yīng)用,命名向量(即一維數(shù)組)的索引將根據(jù)邏輯返回。
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
(數(shù)據(jù)分析庫),等效項也適用:DataFrame.apply
軸設(shè)置為index
在所有列上運行操作。等價地,您可以運行DataFrame.aggregate
.?返回是一個熊貓系列,類似于 R 的命名向量作為一維數(shù)組。
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來實現(xiàn):[...].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(支持?jǐn)?shù)組的數(shù)值計算庫),您可以使用numpy.apply_along_axis. 并等同于 Pandas' var,相應(yīng)地調(diào)整默認(rèn)值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]
添加回答
舉報