[英]R if statement error: the condition has length > 1 and only the first element will be used
[英]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.