【发布时间】:2017-01-03 01:40:42
【问题描述】:
我有一个数据框:
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
【问题讨论】:
-
问题在于,当使用 == 作为逻辑运算符时,实际上只有一个,分别选择了第一个条目。 @akrun 的矢量化答案应该可以完成这项工作。
-
从技术上讲,你也可以使用
with(df, (a * c(-1L, 1L)[(a == b) +1L]) + b)这样的东西,但它不是很直观