如何将这个令人困惑的Python行转换为R

Kla*_*sos 7 python r pandas

我是Python的新手,我想知道以下代码行在做什么以及如何用R编写:

df['sticky'] = df[['humidity', 'workingday']].apply(lambda x: (0, 1)[x['workingday'] == 1 and x['humidity'] >= 60], axis = 1)
Run Code Online (Sandbox Code Playgroud)

例如,是什么意思lambda x: (0, 1)

PS df是一个pandas数据帧

Ste*_*ppo 5

让我们从开始吧lambda.完整的表达方式是:

 lambda x: (0, 1)[x['workingday'] == 1 and x['humidity'] >= 60]
Run Code Online (Sandbox Code Playgroud)

它是一个匿名函数,它接受一个参数x并返回:

  • 1 如果 x['workingday'] == 1 and x['humidity'] >= 60
  • 0 除此以外

这个(0, 1)[...]技巧用于返回01代替Python booleans FalseTrue.它利用了这个事实,False并且True将被强制转换为数字0并且1当用于代替数值时,例如作为数组(或元组)索引.例如,如果表达式求值为True,1则访问元组的单元格,其中包含1.

此功能映射到(熊猫?)数据帧(实际上,仅在过滤列的每一行'humidity''workingday'),并将结果保存在'sticky'列.这就是说,你可以使用匿名翻译中的R相同的表达式functionapply:

df$sticky <- apply(df[, c("workingday", "humidity")], 1, function(x) {
    x["workingday"] == 1 & x["humidity"] >= 60;
});
Run Code Online (Sandbox Code Playgroud)

(过滤可能没有必要,但我的R技能非常生疏).

然而,正如kdopen所写的那样,有一种更为惯用的方式来实现同样的目的:

df$sticky <- df$workingday == 1 & df$humidity >= 60
Run Code Online (Sandbox Code Playgroud)