Создание новой переменной в r с использованием ifelse и% in% - PullRequest
1 голос
/ 28 июня 2019

Я хочу создать новую переменную, в которой, если переменная $ Who.went.first содержится в переменной $ Who.should.go.first, она вернет TRUE для новой переменной, иначе она вернет FALSE. $ Who.should.go.first и $ Who.went.first, оба имеют одинаковый набор имен машин в качестве входных данных, за исключением того, что все входные данные $ Who.should.go.first имеют текст "(Aspect)" в конце, поэтому я хочу, чтобы функция проверяла, что $ Who.went.first содержится в $ Who.went.first, а не ищет точные совпадения.

Я пытаюсь сделать это, используя функцию ifelse и% в%, как показано ниже.

Cooperation_2clean$correct.go.first <- ifelse((Cooperation_2clean$Who.went.first %in% Cooperation_2clean$Who.should.go.first), "TRUE", "FALSE")

Это создаст новую переменную, за исключением того, что каждый случай возвращает FALSE. Например, если $ Who.went.first равен «AV_0_Blue», а $ Who.should.go.first равен «AV_0_Blue (Aspect)», тогда он возвращает FALSE, когда он должен быть истинным.

Должен ли я использовать другую функцию, например case_when?

EDIT:

Некоторые примеры данных:

Cooperation_2clean <- data.frame("Who.should.go.first" = c("AV_0_Blue (Aspect)", "Human_2_BlueCW (Aspect)", "AV_0_Blue (Aspect)", "AV_2_Green (Aspect)", "AV_3_Orange (Aspect)"), "Who.went.first" = c("AV_0_Blue", "AV_3_Orange", "AV_0_Blue", "AV_2_Green", "AV_2_Green"))

Ответы [ 3 ]

0 голосов
/ 28 июня 2019

Вот мое решение

library("tidyverse")

# Your sample dataframe
Cooperation_2clean <-
  data.frame(
    "Who.should.go.first" = c(
      "AV_0_Blue (Aspect)",
      "Human_2_BlueCW (Aspect)",
      "AV_0_Blue (Aspect)",
      "AV_2_Green (Aspect)",
      "AV_3_Orange (Aspect)"
    ),
    "Who.went.first" = c(
      "AV_0_Blue",
      "AV_3_Orange",
      "AV_0_Blue",
      "AV_2_Green",
      "AV_2_Green"
    )
  )

# Create a new column named "new_var" where we check rowise
# if the string in Who.went.first is contained in Who.should.go.first
Cooperation_2clean %>% 
  rowwise() %>% 
  mutate(new_var = grepl(Who.went.first, Who.should.go.first))

# Who.should.go.first     Who.went.first new_var
#   <fct>                   <fct>          <lgl>  
# 1 AV_0_Blue (Aspect)      AV_0_Blue      TRUE   
# 2 Human_2_BlueCW (Aspect) AV_3_Orange    FALSE  
# 3 AV_0_Blue (Aspect)      AV_0_Blue      TRUE   
# 4 AV_2_Green (Aspect)     AV_2_Green     TRUE   
# 5 AV_3_Orange (Aspect)    AV_2_Green     FALSE

0 голосов
/ 28 июня 2019

Существует пакет под названием stringr, предназначенный для подобных вещей.

# Your sample dataframe
Cooperation_2clean <-
  data.frame(
    "Who.should.go.first" = c(
      "AV_0_Blue (Aspect)",
      "Human_2_BlueCW (Aspect)",
      "AV_0_Blue (Aspect)",
      "AV_2_Green (Aspect)",
      "AV_3_Orange (Aspect)"
    ),
    "Who.went.first" = c(
      "AV_0_Blue",
      "AV_3_Orange",
      "AV_0_Blue",
      "AV_2_Green",
      "AV_2_Green"
    ),
    stringsAsFactors = FALSE
  )

library(stringr)
new_var <- str_detect(Cooperation_2clean$Who.should.go.first,Cooperation_2clean$Who.went.first)
# [1]  TRUE FALSE  TRUE  TRUE FALSE

library(stringr)
library(dplyr)
Cooperation_2clean <- Cooperation_2clean %>%
  mutate(new_var = str_detect(Who.should.go.first,Who.went.first))
#       Who.should.go.first Who.went.first new_var
# 1      AV_0_Blue (Aspect)      AV_0_Blue    TRUE
# 2 Human_2_BlueCW (Aspect)    AV_3_Orange   FALSE
# 3      AV_0_Blue (Aspect)      AV_0_Blue    TRUE
# 4     AV_2_Green (Aspect)     AV_2_Green    TRUE
# 5    AV_3_Orange (Aspect)     AV_2_Green   FALSE
0 голосов
/ 28 июня 2019

Я думаю, grepl - это функция, которую вы ищете. например,

biggerstring <- 'LargeItemFindText'
smallstring <-  'geItem'
badstring <- 'notthere'

ifelse(grepl(smallstring, biggerstring) > 0, 1, 0)
ifelse(grepl(badstring, biggerstring) > 0, 1, 0)
  • редактировать

для вашего примера, тогда вы используете grepl с функцией apply. Рабочий код:

Cooperation_2clean <- data.frame("Who.should.go.first" = c("AV_0_Blue (Aspect)", "Human_2_BlueCW (Aspect)", "AV_0_Blue (Aspect)", "AV_2_Green (Aspect)", "AV_3_Orange (Aspect)"), "Who.went.first" = c("AV_0_Blue", "AV_3_Orange", "AV_0_Blue", "AV_2_Green", "AV_2_Green"))

Cooperation_2clean$Output <- sapply(1:nrow(Cooperation_2clean), function(x) grepl(Cooperation_2clean$Who.went.first[x],
                                                     Cooperation_2clean$Who.should.go.first[x]))

Я думаю, что это более универсальное решение, чем замена конкретной строки, поскольку она также фиксирует возможный двойной интервал, отсутствие пробелов, использование скобок и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...