3

data_active是任何数据集。

理想情况下,当条件满足时,必须更改值。但是当我执行这段代码时,它会将每个指定列中的值更改为if语句中给定的值。

for (i in 1:nrow(data_active))
{
 if(data_active[i,1]==4866)
 {
  data_active$St="MH" 
  data_active$Reg="South Central" 
  data_active$REGION="South"
  data_active$Market="86"
 }
}
4

4 回答 4

6

你需要习惯“用 R 思考”的心态。您不需要 for 循环或 if 语句。您只需一行代码就可以做到这一点。

尝试以下操作(将 id 替换为您的列名):

data_active[data_active$id == 4866,c("St","Reg","REGION","Market")] <- c("MH","South Central", "SOUTH", "86")

首先,该语句查找 id 与 4866 匹配的行,并从中选择由 c 创建的列表中的列。

data_active[data_active$id == 4866,c("St","Reg","REGION","Market")]

其次,它将这些列的值设置为一个新列表,其中包含您想要的值。

<- c("MH","South Central", "SOUTH", "86")
于 2012-08-08T15:38:14.677 回答
3

在您的if语句中,您已经为整个列分配了一个值,而不仅仅是i. 要仅分配给特定行,您需要仅分配给向量的该元素。

for (i in 1:nrow(data_active))
{
 if(data_active[i,1]==4866)
 {
  data_active$St[i]="MH" 
  data_active$Reg[i]="South Central" 
  data_active$REGION[i]="South"
  data_active$Market[i]="86"
 }
}

也就是说,这不是在R. 更自然的是使用逻辑索引。

data_active$St[data_active[,1]==4866]="MH" 
data_active$Reg[data_active[,1]==4866]="South Central" 
data_active$REGION[data_active[,1]==4866]="South"
data_active$Market[data_active[,1]==4866]="86"
于 2012-08-08T15:34:16.073 回答
2

您必须指出要更改哪一行的值。否则,每次都会为所有data_active[i,1]==4866行赋予新值。

尝试这个:

for (i in 1:nrow(data_active))
{
 if(data_active[i,1]==4866)
 {
  data_active$St[i]="MH" 
  data_active$Reg[i]="South Central" 
  data_active$REGION[i]="South"
  data_active$Market[i]="86"
 }
}
于 2012-08-08T15:33:36.583 回答
1

与 Ina 解决方案几乎相同,但也适用于具有不同类型的列(请参阅 Brian Diggs 对 Ina 解决方案的评论)。

data_active[data_active$id == 4866,
            c("St","Reg","REGION","Market")] <- list("MH","South Central", "SOUTH", "86")
于 2012-08-08T17:03:47.730 回答