Какая альтернатива для сравнения нескольких элементов вектора с множеством элементов вектора внутри цикла while в R? - PullRequest
0 голосов
/ 02 июля 2018

while (Данные $ City! = "Мумбаи" || Данные $ City! = "Дели" || Данные $ City! = "Бангалор")

Ошибка следующая:

В while (Данные $ City! = "Мумбаи" || Данные $ City! = ...: условие имеет длину> 1, и будет использоваться только первый элемент.

Я хочу сравнить элементы столбца с определенными значениями / элементами вектора в цикле while и условно выполнить под ним операторы 'n'? Какая альтернатива для ограничения выше? Какая альтернатива: функция / функция с apply () или ifelse?

DataO <- c("Mumbai","Jaipur","Delhi","Chennai","Bengaluru")

Data1 <- setNames(data.frame(matrix(ncol = 1, nrow = 5), c("City"))

for(i in seq_along(DataO))
{
while (DataO!="Mumbai" || DataO!="Delhi" || DataO!= "Bengaluru")
{
Data1$City[i] <- as.character(DataO[i])
}
}

Я хочу выполнить оператор в 'while ()', когда Мумбаи == Мумбаи (i = 1), а затем для Дели == Дели (i = 3), а затем для Бенгалуру == Бенгалуру (i = 5). Следует пропустить итерацию i = 2 и i = 4.

Здесь только первый элемент (i = 1) оценивается и добавляется (Мумбаи)

> Data1
   City
1 Mumbai
2   <NA>
3   <NA>
4   <NA>
5   <NA>

Желаемый вывод:

> Data1
  City
1 Mumbai
2   <NA>
3 Delhi
4   <NA>
5 Bengaluru

Суть здесь в том, что «что-то (элемент / элемент строки) в одном месте (столбец / вектор данных) соответствует чему-то (элемент / элемент строки) в другом месте (столбец / вектор данных) выполняет операторы до тех пор, пока условие не будет выполнено, и повторить это для всех последующих совпадений (и выйти из цикла) '.

Отступление: могут ли имена строк быть пустыми (тип символа "") в R / Можно ли назначить пустые имена строк (тип символа "") в R?

1 Ответ

0 голосов
/ 02 июля 2018

Предполагая, что Data$City является вектором названий городов, а также предполагая, что вы хотите проверить, присутствует ли хотя бы одно из этих названий городов в данном списке, вы можете:

  1. Сохранить все действительные названия городов в символьном векторе, а именно validCities.
  2. Используйте оператор %in% между этими двумя векторами, чтобы получить логический вектор. Этот вектор будет той же длины, что и первый, и в нем будет указано, какие из этих городов содержатся во втором векторе.
  3. Используйте функцию sum, чтобы проверить наличие хотя бы одного положительного значения, то есть проверить, присутствует ли какой-либо из городов, содержащихся в первом векторе, во втором векторе.

Пример ниже.

Data <- data.frame(City = c('Chennai', 'Delhi', 'Bhopal', 'Pune', 'Kolkata'));

validCities <- c('Mumbai', 'Delhi', 'Bengaluru');

if (sum(Data$City %in% validCities) > 0) {
    // Your code here.
}

Изменено:

Теперь, когда вы предоставили желаемый результат, я вижу, что это довольно просто. Не зацикливайтесь на подходах, ориентированных на петли, data.frame можно легко выбирать и фильтровать по строкам, просто предоставьте условие для тех строк, которые вы хотите рассмотреть, и укажите, какие столбцы вы хотите извлечь или изменить.

В этом случае я выбираю те строки, которые CITY не являются одним из трех представленных, и я присваиваю значение NA столбцу CITY:

data <- data.frame(CITY = c('Mumbai', 'Jaipur', 'Delhi', 'Chennai', 'Bengaluru'));

data[!(data$CITY %in% c('Mumbai', 'Delhi', 'Bengaluru')), 'CITY'] <- NA;

Выход:

> data
       CITY
1    Mumbai
2      <NA>
3     Delhi
4      <NA>
5 Bengaluru

Кроме того, вы можете просто удалить ненужные строки, в этом случае оставшиеся строки сохранят свое первоначальное имя строки:

data <- data[data$CITY %in% c('Mumbai', 'Delhi', 'Bengaluru'), , drop = FALSE];

Выход:

> data
       CITY
1    Mumbai
3     Delhi
5 Bengaluru
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...