You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 20:34:53