Mam dataframe:Dataframe utworzyć nową kolumnę na podstawie innych kolumn
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
i chcę utworzyć nową kolumnę na podstawie istniejących kolumn. Coś takiego:
if (df[['a']] == df[['b']]) {
df[['c']] <- df[['a']] + df[['b']]
} else {
df[['c']] <- df[['b']] - df[['a']]
}
Problem polega na tym, że warunek if
sprawdzana jest tylko dla pierwszego rzędu ... Jeśli utworzyć funkcję z powyższym stwierdzeniem if
następnie używam apply()
(lub mapply()
...) to jest to samo.
W Pythonie/pandy mogę użyć tego:
df['c'] = df[['a', 'b']].apply(lambda x: x['a'] + x['b'] if (x['a'] == x['b']) \
else x['b'] - x['a'], axis=1)
Chcę coś podobnego w R. Tak więc wynik powinien wyglądać następująco:
a b c
1 1 1 2
2 2 20 18
3 3 3 6
4 4 4 8
5 5 50 45
Problem polega na tym, że gdy używa się == jako operatora logicznego, który rzeczywiście tylko jeden, respekt ely wybrano pierwszy wpis. Wektoryzowana odpowiedź @akrun powinna wykonać zadanie. – jd1338
Technicznie, możesz też użyć czegoś takiego jak 'with (df, (a * c (-1L, 1L) [(a == b) + 1L]) + b)' ale to nie jest bardzo intuicyjne –