簡體   English   中英

如果語句中出現%in%錯誤條件警告:長度> 1,並且僅使用第一個元素

[英]If statement with %in% error Condition warning: has length > 1 and only the first element will be used

我在R中有6列的數據幀schedule 如果第一列的值在特定列表中,我想更改其他列的值。

這是我嘗試的代碼,並且收到錯誤消息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%找不到任何問題,非常感謝您的幫助

解決了。 非常感謝大家的幫助

由於您要將data.frame的整個第一列傳遞給%in%(schedule [,1]),因此您的%in%操作將返回一個布爾向量,第一列中的每個元素都為一個布爾向量。 同時, 如果僅接受一個值。

%in%返回的內容如下:

TRUE FALSE FALSE TRUE etc.

但是如果只能處理一個值。

也許您想使用any() ,它返回一個布爾值,該布爾值指示給定輸入中的任何值是否為TRUE。 因此,如果列表中第1列的任何元素在列表中,您將獲得一個TRUE值。 請注意,這未經測試。

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

當您運行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,以避免列類出現問題。

您要執行此操作的方式的一個問題是,第4列至第6列當前為日期類型,但是您不能將“ Removed to contingency”之類的字符串值放入日期列,而無需將其更改為字符串類型。 考慮到這一點,我認為您想要的是:

# 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可能是更“像R”的方式。 此外,您可以創建一個額外的列來記錄刪除該列的原因,例如:

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

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"
    }
}

有更優雅的方法可以解決此問題,但是這種方法幾乎不需要對代碼進行任何調整。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM