我在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% 非常感谢你的帮助
这已经解决了。非常感谢大家的帮助
答案 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"
}
}
有更优雅的方法来解决这个问题,但这种方式几乎不需要对代码进行调整。