首页 > 解决方案 > R中的while循环内多元素向量与多元素向量比较的替代方法是什么?

问题描述

而 (Data$City!="Mumbai" || Data$City!="Delhi" || Data$City!= "Bengaluru")

错误如下:

在 while (Data$City!="Mumbai" || Data$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])
}
}

我想在孟买==孟买(i=1)时执行“while()”下的语句,然后是德里==德里(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

这里的关键是 ' 而某个地方的某物(元素/行 obs)(数据列/向量)匹配其他地方的某物(元素/行 obs)(数据列/向量)执行语句直到满足条件并迭代它所有后续匹配(并跳出循环)'。

题外话: R 中的行名可以为空(字符类型“”)/是否可以在 R 中分配空行名(字符类型“”)?

标签: r

解决方案


假设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.
}

更新:

现在您已经提供了所需的输出,我可以看到这很容易。不要停留在以循环为中心的方法上,adata.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

推荐阅读