R用户转Python:实现R中source()函数的等效功能
从R的
source()到Python的脚本调用实现 作为R转Python的用户,你已经选对了方向:Python里更推荐用模块化函数+模块导入的方式实现类似Rsource()的复用逻辑,而非直接注入全局环境(虽然也能实现,但不规范)。下面是对你现有代码的验证和完善,确保和R的逻辑完全对齐:
核心差异说明
R的source()会将目标脚本的代码直接加载到当前全局环境,共享所有变量;而Python的设计更强调显式传递参数,避免全局变量污染,因此用函数封装通用逻辑是最佳实践。
修正后的Python代码
通用步骤脚本:common_step.py
修正了逻辑顺序(和R的步骤对齐:先过滤原变量的NA,再重命名),并优化了部分写法:
import pandas as pd import numpy as np def first_step(tab_id, tab_data, target_var): # 对应R中file_ID %>% group_by(ID) %>% mutate(n_val = n()) tab_id["nb_val"] = tab_id.groupby('ID')['ID'].transform('count') # 对应left_join merged = pd.merge(tab_data, tab_id, how="left", on="ID") # 替换NA为0,生成cdk列 merged["nb_val"] = merged["nb_val"].fillna(0) merged['cdk'] = np.where(merged['nb_val'] > 0, 'Yes', 'No') # 去重ID,保留所有列(对应distinct(ID, .keep_all = T)) merged_unique = merged.drop_duplicates(subset=['ID'], keep='first') # 先过滤目标变量的NA,再重命名(和R步骤顺序一致) merged_filtered = merged_unique.dropna(subset=[target_var]) result = merged_filtered.rename(columns={target_var: 'variable'}) return result
主分析脚本:analysis1.py
修正了参数错误(将data改为定义好的df2),并保持后续分析逻辑:
import pandas as pd import numpy as np from common_step import first_step # 数据定义 df2 = pd.DataFrame( { "ID": ["I1", "I2", "I3", "I4", "I5", "I6", "I7", "I8", "I9"], "Sex": ["F", "F", "F", "M", "F", "M", "M", "F", "F"], "groupe": ["A", "A", "A", "B", "B", "B", "C", "C", "C"], "var1": [8,9,6,6,np.nan,5,6,2,5], "var2": [7,12,5,9,9,11,8,2,7], "var3": [np.nan,4,7,9,5,10,6,np.nan,4] } ) file_ID = pd.DataFrame( { "ID": ["I1", "I1", "I2", "I3", "I6", "I9"], "cl1": [7,4,5,8,7,1] } ) # 待分析变量 variable_to_analyse = "var1" # 调用通用步骤 tab_3 = first_step(file_ID, df2, variable_to_analyse) # 后续分析逻辑 tab_3["mean_value"] = tab_3.groupby(['Sex', 'groupe'])['variable'].transform('mean') data_3 = tab_3 # ... 后续代码
若非要模拟R的source()(不推荐)
如果你想完全复刻Rsource()直接加载全局变量的行为,可以用以下代码,但这会污染全局环境,不利于代码维护:
# 在主脚本中执行 exec(open('./common_step.py').read())
但强烈建议使用函数封装的方式,这更符合Python的编程规范。
内容的提问来源于stack exchange,提问作者Av65
相关产品推荐
相关产品推荐

