データフレームの複数列を一つの列で割る


以下のようなデータフレーム

[code]

    a1,a2,a3,b1
    1,1,2,4
    3,4,2,1
    3,6,2,9
    ...
    
    
[/code]

を考えます。  
c1=a1/b1,c2=a2/b1,c3=a3/b1をそれぞれ計算してデータフレームの右につけようと考えています。  
この場合は3変数なのでまだ手で書けますが、（Rの場合は`mutate(c1=a1/b1,c2=a2/b1,c3=a3/b1)`でしょうか。)より変数が増えたときに対応できる方法をPython(pandas),
R(dplyr)の両方で知りたいです。  
よろしくお願いいたします。




pandasならこうでしょうか。

[code]

    df1 = pd.DataFrame([[1,1,2,4],
                        [3,4,2,1],
                        [3,6,2,9]],
                      columns=["a1","a2","a3","b1"])
    
    df2 = df1.div(df1["b1"], axis=0).drop("b1", axis=1) # 各列をb1で割る
    df2.columns = df2.columns.map(lambda s: s.replace("a", "c"))
    
    df3 = pd.concat([df1, df2], axis=1) # 右に連結
    
[/code]

Rで同様にやるならこうでしょうか。

[code]

    df1 <- data.frame(a1=c(1,3,3), a2=c(1,4,6), a3=c(2,2,2), b1=c(4,1,9))
    
    df2 <- df1 / df1$b1
    df2$b1 <- NULL
    df2 <- rename_all(df2, function (x) sub("a", "c", x))
    
    df3 <- cbind(df1, df2)
    
[/code]

