Создание новой переменной на основе определенного результата в любом из списка переменных

#r #tidyverse #dplyr

Вопрос:

Поэтому я хочу создать новую условную переменную, подобную приведенной ниже. В принципе, мне нужна переменная, которая обозначает любой положительный результат в списке других переменных. Я пытался использовать case_when, но безуспешно.

переменная 1 переменная 2 изменяемый 3 Новая переменная
1 0 0 1
0 0 1 1
0 1 1 1
0 0 0 0

Комментарии:

1. (rowSums(DF) > 0)

Ответ №1:

Надеюсь, я правильно понял, что вы искали. Я создал new_var переменную, основанную на наличии любого положительного значения в строке:

 library(dplyr)

df %>%
  rowwise() %>%
  mutate(new_var =  any(c_across(everything()) > 0, na.rm = TRUE))

# A tibble: 4 x 4
# Rowwise: 
  variable1 variable2 variable3 new_var
      <int>     <int>     <int>   <int>
1         1         0         0       1
2         0         0         1       1
3         0         1         1       1
4         0         0         0       0
 

Ответ №2:

использование cur_data() в dplyr

 library(dplyr)

df %>% mutate(new_v =  (rowSums(cur_data()) > 0))

#>   variable1 variable2 variable3 new_v
#> 1         1         0         0     1
#> 2         0         0         1     1
#> 3         0         1         1     1
#> 4         0         0         0     0
 

Создано 2021-06-08 пакетом reprex (v2.0.0)

Ответ №3:

Вы можете найти максимальное значение в каждой строке.

 df$new_variable <- do.call(pmax, df)
df

#  variable1 variable2 variable3 new_variable
#1         1         0         0            1
#2         0         0         1            1
#3         0         1         1            1
#4         0         0         0            0
 

данные

 df <- structure(list(variable1 = c(1L, 0L, 0L, 0L), variable2 = c(0L, 
0L, 1L, 0L), variable3 = c(0L, 1L, 1L, 0L), new_variable = c(1L, 
1L, 1L, 0L)), row.names = c(NA, -4L), class = "data.frame")
 

Ответ №4:

Можно использовать Reduce С | в base R так, что любое значение, не равное 0 будет true и 0 для ложного который выполняет поэлементное сравнение для каждой строки и возвращает true, если есть хотя бы один ненулевой, то мы сподвигнуть логично бинарные с (Истина -> 1, значение false -> 0)

 df$new_variable <-  (Reduce(`|`, df))
 

данные

 df <- structure(list(variable1 = c(1L, 0L, 0L, 0L), variable2 = c(0L, 
0L, 1L, 0L), variable3 = c(0L, 1L, 1L, 0L)), row.names = c(NA, 
-4L), class = "data.frame")
 

Ответ №5:

Вы можете использовать pmap_dbl для применения оператора if_else , который проверяет, являются ли какие-либо значения var1 var2 или var3 положительными. Это решение работает независимо от того, каковы числовые значения вышеуказанных переменных.

 library(tidyverse)

# reproduce your data
mydata <- tibble(
  var1 = c(1,0,0,0),
  var2 = c(0,0,1,0),
  var3 = c(0,1,1,0)
)

mydata %>%
  mutate(
     newvar = pmap_dbl(list(var1, var2, var3), ~ if_else(any(c(..1, ..2, ..3) > 0), 1, 0))
  )