数据框基于其他列创建新列 [英] Dataframe create new column based on other columns
问题描述
我有一个数据框:
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
我想根据现有列创建一个新列.像这样:
and I want to create a new column based on existing columns. Something like this:
if (df[['a']] == df[['b']]) {
df[['c']] <- df[['a']] + df[['b']]
} else {
df[['c']] <- df[['b']] - df[['a']]
}
问题是 if
条件只检查第一行...如果我从上面的 if
语句创建一个函数,那么我使用 apply()
(或mapply()
...),都是一样的.
The problem is that the if
condition is checked only for the first row... If I create a function from the above if
statement then I use apply()
(or mapply()
...), it is the same.
在 Python/pandas 中我可以使用这个:
In Python/pandas I can use this:
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 中类似的东西.所以结果应该是这样的:
I want something similar in R. So the result should look like this:
a b c
1 1 1 2
2 2 20 18
3 3 3 6
4 4 4 8
5 5 50 45
推荐答案
一个选项是 ifelse
,它是 if/else
的矢量化版本.如果我们对每一行都这样做,则 OP 的熊猫帖子中显示的 if/else
可以在 for
循环或 lapply/sapply
,但这在 R
中效率很低.
One option is ifelse
which is vectorized version of if/else
. If we are doing this for each row, the if/else
as showed in the OP's pandas post can be done in either a for
loop or lapply/sapply
, but that would be inefficient in R
.
df <- transform(df, c= ifelse(a==b, a+b, b-a))
df
# a b c
#1 1 1 2
#2 2 20 18
#3 3 3 6
#4 4 4 8
#5 5 50 45
<小时>
也可以写成
This can be otherwise written as
df$c <- with(df, ifelse(a==b, a+b, b-a))
在原始数据集中创建'c'列
to create the 'c' column in the original dataset
因为 OP 希望在 R
中使用 if/else
As the OP wants a similar option in R
using if/else
df$c <- apply(df, 1, FUN = function(x) if(x[1]==x[2]) x[1]+x[2] else x[2]-x[1])
这篇关于数据框基于其他列创建新列的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!