我有一个数据框:
df <- data.frame('a'=c(1,2,3,4,5), 'b'=c(1,20,3,4,50))
df
a b
1 1 1
2 2 20
3 3 3
4 4 4
5 5 50
我想基于现有列创建一个新列。类似这样:
if (df[['a']] == df[['b']]) {
df[['c']] <- df[['a']] + df[['b']]
} else {
df[['c']] <- df[['b']] - df[['a']]
}
问题在于if
条件只对第一行进行检查... 如果我从上述的if
语句创建一个函数,然后使用apply()
(或mapply()
...),结果是相同的。
在Python/pandas中,我可以使用以下代码:
df['c'] = df[['a', 'b']].apply(lambda x: x['a'] + x['b'] if (x['a'] == x['b']) \
else x['b'] - x['a'], axis=1)
我希望在R中得到类似的东西。因此,结果应该看起来像这样:
a b c
1 1 1 2
2 2 20 18
3 3 3 6
4 4 4 8
5 5 50 45
with(df, (a * c(-1L, 1L)[(a == b) +1L]) + b)
的方法,但这并不是很直观。 - talat