Добавление кондиционирования столбцов в другие столбцы - PullRequest
0 голосов
/ 30 мая 2020

Я хочу создать новый столбец z на основе значений x и y. Если x>y, z=y иначе z=x.

x  y  
3  4 
5  2
6  6
1  7
9  4

Требуется вывод:

x  y  z
3  4  3
5  2  2
6  6  6
1  7  1
9  4  4

Ответы [ 4 ]

1 голос
/ 30 мая 2020

Вы можете использовать ifelse:

df$z <- with(df, ifelse(x > y, y, x))
#Or without with
#df$z <- ifelse(df$x > df$y, df$y, df$x)
df

#  x y z
#1 3 4 3
#2 5 2 2
#3 6 6 6
#4 1 7 1
#5 9 4 4

В dplyr вы можете использовать if_else, что и выше, или case_when, что полезно, когда вам нужно перечислить вниз по нескольким условиям.

library(dplyr)
df %>% 
 mutate(z = case_when(x > y ~ y,
                      TRUE ~x))
0 голосов
/ 30 мая 2020

Другой вариант с fifelse в data.table

library(data.table)
setDT(dt)[, z := fifelse(x > y, y, x)]
0 голосов
/ 30 мая 2020

Аналогично другому ответу, но с использованием data.table и pmin:

library(data.table)
dt <- data.table(x = c(3,5,6,1,9), 
                 y = c(4,2,6,7,4))

dt[, z:= pmin(x,y)]
dt

# x y z
# 1: 3 4 3
# 2: 5 2 2
# 3: 6 6 6
# 4: 1 7 1
# 5: 9 4 4

Функция pmin возвращает параллельные минимумы (https://www.rdocumentation.org/packages/mc2d/versions/0.1-17/topics/pmin)

0 голосов
/ 30 мая 2020

Если я правильно понял, вы ищете минимальное значение из нескольких столбцов. Вы можете использовать функцию pmin :

library(dplyr)
df <- data.frame(x = c(3,5,6,1,9), 
                 y = c(4,2,6,7,4))

df <- df %>% mutate(z = pmin(x, y))

результат:

> df
  x y z
1 3 4 3
2 5 2 2
3 6 6 6
4 1 7 1
5 9 4 4

Он будет подсчитывать минимальное значение в строке фрейма данных и упростит синтаксис, если вы хотел бы включать более 2 столбцов:

df <- data.frame(x = c(3, 5, 6, 1, 9), 
                 y = c(4, 2, 6, 7, 4),
                 a = c(2, 5, 7, 3, 3))

df <- df %>% mutate(z = pmin(x, y, a))

результат:

> df
  x y a z
1 3 4 2 2
2 5 2 5 2
3 6 6 7 6
4 1 7 3 1
5 9 4 3 3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...