Создать таблицу данных новый столбец на основе других столбцов
у меня есть фрейм данных:
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
и я хочу создать новый столбец на основе существующих столбцов. Что-то вроде этого:--9-->
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
5 ответов
один из вариантов -ifelse
это векторизованных версия if/else
. Если мы делаем это для каждой строки if/else
как показано в посте панды OP можно сделать в любом for
петли или lapply/sapply
, но это было бы неэффективно в 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
это может быть иначе записано как
df$c <- with(df, ifelse(a==b, a+b, b-a))
чтобы создать столбец " c " в исходном наборе данных
поскольку OP хочет аналогичную опцию в R
используя if/else
df$c <- apply(df, 1, FUN = function(x) if(x[1]==x[2]) x[1]+x[2] else x[2]-x[1])
вот немного более запутанный алгебраический метод:
df$c <- with(df, b + ((-1)^((a==b)+1) * 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
идея в том, что оператор "минус" включается или выключается на основе теста a==b
.
решение apply
myFunction <- function(x){
a <- x[1]
b <- x[2]
#further values ignored (if there are more than 2 columns)
value <- if(a==b) a + b else b - a
#or more complicated stuff
return(value)
}
df$c <- apply(df, 1, myFunction)
Если вы хотите применить метод, то другой способ, с mapply
было бы создать функцию и применить ее,
fun1 <- function(x, y) if (x == y) {x + y} else {y-x}
df$c <- mapply(fun1, df$a, df$b)
df
# a b c
#1 1 1 2
#2 2 20 18
#3 3 3 6
#4 4 4 8
#5 5 50 45
использование пакета dplyr:
library(dplyr)
df <- df %>%
mutate(c = if_else(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