在R中的while循环内进行多元素向量与多元素向量比较的替代方法是什么?

时间:2018-07-02 05:49:42

标签: r

同时(Data $ City!=“孟买” || 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),然后是德里==德里(i = 3),然后是班加罗尔==孟加拉国(i = 5)时,我想在'while()'下执行语句。应该跳过迭代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 :(得分:0)

假设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可以轻松地按行选择和过滤,只需为要考虑的行提供条件,并指出要检索或修改的列。 / p>

在这种情况下,我要选择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