Соответствие строки, если значение соответствует любой строке в векторе - PullRequest
0 голосов
/ 26 апреля 2018

Я пытаюсь создать набор данных в этой форме:

enter image description here

Я не могу понять, что не так с циклом forи если.

А также есть ли другое простое решение того, что я делаю в R?

equality_vector <- c("CEO", "COO","CTO","CDO","CFO","CTO","CIO")

Position <- c("Retired CEO", "COO/Board member", "Operator")
Role <- c(NA, NA, NA)
position1<- cbind.data.frame(Position, Role)

for(pos in position1$Position)
{
  a <- NA
  for (var in equality_vector) {
  if (grepl(var,pos)) {
  a <- var
}
break
}
position1$Role[position1$Position == pos] <- a
}

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Другим подходом может быть

library(dplyr)

data.frame(Position) %>%
  rowwise() %>%
  mutate(Role = ifelse(any(unlist(lapply(equality_vector, function(x) grepl(x, Position)))),
                       equality_vector[unlist(lapply(equality_vector, function(x) grepl(x, Position)))],
                       NA)) %>%
  data.frame() -> df
df

Вывод:

          Position Role
1      Retired CEO  CEO
2 COO/Board member  COO
3         Operator <NA>

Пример данных:

equality_vector <- c("CEO", "COO", "CTO", "CDO", "CFO", "CTO", "CIO")
Position <- c("Retired CEO", "COO/Board member", "Operator")
0 голосов
/ 26 апреля 2018

Это сделает работу.Он избегает одного цикла (другой цикл скрывается в операторе map_int. Большинство программистов на R избегают таких циклов, как чума. Они, как правило, очень медленные в R. Возможно, вы захотите прочитать некоторые из этих функций ишаг за шагом, что каждый делает.

library(tidyverse)
match_positions <- function(position) {
  outer(position, equality_vector,  str_detect) %>% 
    t() %>% 
    as_data_frame() %>% 
    map_int(.f = function(x) {
      tmp <- which(x)
      if(length(tmp) == 0) tmp <- NA_integer_
      tmp
    })
}

df <- data.frame(Position)
df %>% 
  mutate(
    Role = equality_vector[match_positions(Position)]
  )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...