Как назначить TRUE или FALSE, если слово присутствует в любом из нескольких столбцов? - PullRequest
1 голос
/ 02 июня 2019

У меня есть фрейм данных, пара столбцов со случайными данными, которые я не хочу использовать, и 10 столбцов (столбец 8:17), содержащих различные имена актеров в нескольких фильмах, каждая строка - это фильм иколонка 8:17 названы 10 главных актеров в этом фильме.Я хочу проверить, фигурирует ли имя определенного актера «Сэмюэл Л. Джексон» в любой из этих колонок (8:17) для каждого фильма.

Я создал пустой столбец в конце моего фрейма данных.Если имя присутствует в столбце 8:17, я хочу присвоить 1.Если это не так, я хочу, чтобы это было 0.

Это довольно простая проблема, как кажется, однако я пробовал много разных вещей, и ни одна из них, похоже, не работает ...

Что делатьdo?

Я пробовал этот цикл для каждой строки (фильма) с помощью функции ifelse, и я пробовал то же самое с отдельными операторами if else.

for (i in nrow(All_dataset)) {
  All_dataset[i, 18] <- ifelse("Samuel L. Jackson" %in% All_dataset[i, 8], 1, 0)
  All_dataset[i, 18] <- ifelse("Samuel L. Jackson" %in% All_dataset[i, 9], 1, 0)
  All_dataset[i, 18] <- ifelse("Samuel L. Jackson" %in% All_dataset[i, 10], 1, 0)
  All_dataset[i, 18] <- ifelse("Samuel L. Jackson" %in% All_dataset[i, 11], 1, 0)
  All_dataset[i, 18] <- ifelse("Samuel L. Jackson" %in% All_dataset[i, 12], 1, 0)
  All_dataset[i, 18] <- ifelse("Samuel L. Jackson" %in% All_dataset[i, 13], 1, 0)
  All_dataset[i, 18] <- ifelse("Samuel L. Jackson" %in% All_dataset[i, 14], 1, 0)
  All_dataset[i, 18] <- ifelse("Samuel L. Jackson" %in% All_dataset[i, 15], 1, 0)
  All_dataset[i, 18] <- ifelse("Samuel L. Jackson" %in% All_dataset[i, 16], 1, 0)
  All_dataset[i, 18] <- ifelse("Samuel L. Jackson" %in% All_dataset[i, 17], 1, 0)
}
for (i in nrow(All_dataset)) {
  if (is.element("Samuel L. Jackson", All_dataset[i, 8]) == TRUE) {
    All_dataset[i, 18] <- 1
  }
  else if (is.element("Samuel L. Jackson", All_dataset[i, 9]) == TRUE) {
    All_dataset[i, 18] <- 1
  }
  else if (is.element("Samuel L. Jackson", All_dataset[i, 10]) == TRUE) {
    All_dataset[i, 18] <- 1
  }
  else if (is.element("Samuel L. Jackson", All_dataset[i, 11]) == TRUE) {
    All_dataset[i, 18] == 1
  }
  else if (is.element("Samuel L. Jackson", All_dataset[i, 12]) == TRUE) {
    All_dataset[i, 18] == 1
  } 
  else if (is.element("Samuel L. Jackson", All_dataset[i, 13]) == TRUE) {
    All_dataset[i, 18] <- 1
  }
  else if (is.element("Samuel L. Jackson", All_dataset[i, 14]) == TRUE) {
    All_dataset[i, 18] <- 1
  }
  else if (is.element("Samuel L. Jackson", All_dataset[i, 15]) == TRUE) {
    All_dataset[i, 18] <- 1
  }
  else if (is.element("Samuel L. Jackson", All_dataset[i, 16]) == TRUE) {
    All_dataset[i, 18] <- 1
  }
  else if (is.element("Samuel L. Jackson", All_dataset[i, 17]) == TRUE) {
    All_dataset[i, 18] <- 1
  }
  else {
    All_dataset[i, 18] <- 0
  }
}

Иногда ИСТИНАприсваивается всем им, иногда FALSE, но это никогда не делается правильно (1 для фильма появляется Сэмюэль и 0, если он не появляется)

1 Ответ

1 голос
/ 02 июня 2019

Мы подставляем столбцы 8:17 в 'All_dataset', проверяем, равно ли оно (==) "Сэмюэлю Л. Джексону", чтобы вернуть логическую матрицу, получаем rowSums, проверяем, больше ли оно чем 0, чтобы вернуть логический вектор, привести его к двоичному (ИСТИНА -> 1, ЛОЖЬ -> 0) с помощью as.integer и присвоить (<-) его 18-му столбцу

All_dataset[, 18] <- as.integer(rowSums(All_dataset[, 8:17] ==
          "Samuel L. Jackson") > 0)

Другой вариант - Reduce с |. Выполните цикл по подмножеству данных (lapply), верните list логических vector с, проверив, присутствует ли строка в столбце, Reduce list логическому вектору с | ( т.е. проверяет, является ли какой-либо из соответствующих элементов ИСТИНА), и преобразует его в двоичный файл, как и раньше

All_dataset[, 18] <-  as.integer(Reduce(`|`, lapply(All_dataset[, 8:17], 
            `==`, "Samuel L. Jackson")))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...