如果带有%in%error的语句条件警告:长度为> 1,只使用第一个元素

时间:2015-03-23 01:28:12

标签: r

我在R中有一个数据框schedule,有6列。如果第1列的值在特定列表中,我想更改其他列的值。

以下是我尝试的代码,我收到错误消息Condition warning: has length > 1 and only the first element will be used

if (schedule[,1] %in% c(540,1040,1050,520))
{
    schedule[,4:6]="Removed to contingency"
}

我在网站上查找了类似的问题,但我没有找到%in%in% 非常感谢你的帮助

这已经解决了。非常感谢大家的帮助

4 个答案:

答案 0 :(得分:1)

由于您将data.frame的整个第一列传递给%in(schedule [,1]),因此%in%operation将返回一个布尔值向量,第一列中的每个元素都有一个布尔值。同时,如果只接受一个值。

%in%返回这样的内容:

TRUE FALSE FALSE TRUE etc.

如果只能处理一个值。

也许您想使用 any(),它返回一个布尔值,指示给定输入中的任何值是否为TRUE。因此,如果列1中的任何元素都在您的列表中,您将获得单个值TRUE。请注意,这是未经测试的。

if(any(schedule[,1] %in% c(540,1040,1050,520))

答案 1 :(得分:0)

当您运行schedule[,1] %in% c(540,1040,1050,520)时,您会获得schedule[,1]的每个值的逻辑向量,但if()语句只接受一个逻辑值,并且警告会告诉您第一个将是用过的。如果要在任何值为true的情况下进行替换,可以使用:

if (any(schedule[,1] %in% c(540,1040,1050,520)))
{
    schedule[,4:6]="Removed to contingency"
}

<强>更新

要仅替换有问题值的行,您可以使用:

schedule[schedule[,1] %in% c(540,1040,1050,520),][4:6] = NA

我将您的文本切换为NA以避免列类出现问题。

答案 2 :(得分:0)

您希望这样做的一个问题是第4列到第6列当前是日期类型,但您不能将字符串值设置为&#34;删除偶然事件&#34;进入日期列而不将其更改为字符串类型。考虑到这一点,我认为你想要的是:

# Convert columns to character
for (i in 4:6) {schedule[, i] = as.character(schedule[, i])}
# Use logical subsetting to apply the change to the right rows
schedule[schedule$Complex_number %in% c(540,1040,1050,520), 4:6] = "Removed to contingency"

给出了:

> schedule
  Complex_number Removal_begins Removal_complete     Begin_installation
1            450     2015-05-02       2015-05-13             2015-05-03
2            440     2015-05-23       2015-06-03             2015-05-24
3            650     2015-06-13       2015-06-24             2015-06-14
4            940     2015-07-04       2015-07-15             2015-07-05
5            950     2015-07-25       2015-08-05             2015-07-26
6            540     2015-08-08       2015-08-19 Removed to contingency
        First_production     Atplanned_capacity
1             2015-06-22             2015-06-06
2             2015-06-29             2015-06-27
3             2015-07-13             2015-07-04
4             2015-08-03             2015-07-25
5             2015-08-24             2015-08-15
6 Removed to contingency Removed to contingency

正如您从其他答案中看到的那样,可以在日期类型列中包含NA个值,因此您可以将这些列保留为日期类型。将这些行标记为NA可能更多&#34; R-like&#34;要走的路。此外,您可以创建一个额外的列来记录删除列的原因,例如:

schedule$RemovedToContingency = schedule$Complex_number %in% c(540,1040,1050,520)

答案 3 :(得分:-1)

if语句一次只能处理一个逻辑。在您的示例中,if条件生成逻辑值的向量,即,它正在测试列1的每一行是否在c(540,1040,1050,520)中。

我建议围绕这个包装一个for循环:

n <- nrows(schedule)
for (i in seq_along(1:n)) {
if (schedule[i,1] %in% c(540,1040,1050,520)) {
      schedule[i,4:6]="Removed to contingency"
    }
}

有更优雅的方法来解决这个问题,但这种方式几乎不需要对代码进行调整。