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]
添加回答
舉報