根据R中的另一列更改一列中的值

时间:2017-05-31 16:33:33

标签: r

所以我使用R并尝试通过比较两列来更改一列中数据框中的值。我有类似

的东西
Median   MyPrice
10       0
20       18
20       20
30       35
15       NA

我想说点什么

if(MyPrice == 0 & MyPrice < Median){MyPrice <- 1
  }else if (MyPrice == Median){MyPrice <- 2
  }else if (MyPrice > Median){MyPrice <- 3
  }else {MyPrice <- 4}

提出

Median   MyPrice
10       1
20       1
20       2
30       3
15       4

但总是有错误。我也试过像

这样的东西
for(i in MyPrice){if(MyPrice == 0 & MyPrice < Median){MyPrice <- 1
  }else if (MyPrice == Median){MyPrice <- 2
  }else if (MyPrice > Median){MyPrice <- 3
  }else {MyPrice <- 4}
  }

for循环运行,但是它将MyPrice中的所有值都更改为4.我也尝试了ifelse()函数,但它似乎有一个问题,一次接受多个参数。

如果像这样的解决方案更容易,我也不会反对将新列添加到数据框的末尾。

3 个答案:

答案 0 :(得分:1)

您不一定要使用for循环。首先将每个比较设置为4。

> x$Comp=4
> x$Comp[x$Median>x$MyPrice]=1 #if Median is higher, comparison = 1
> x$Comp[x$Median==x$MyPrice]=2 #if Median is equal to MyPrice, comparison = 2
> x$Comp[x$Median<x$MyPrice]=3 #if Median is lower, comparison = 3
> x
  Median MyPrice Comp
1     10       0    1
2     20      18    1
3     20      20    2
4     30      35    3
5     15      NA    4

答案 1 :(得分:1)

鉴于您的第一个论点是MyPrice == 0 & MyPrice < Median,您的第二行中位数:20和MyPrice:18也应该是4。这是一个带有NA处理程序的工作嵌套ifelse语句。

df <- as.data.frame(matrix(c(10,0,20,18,20,20,30,35,15,NA), byrow = T, ncol = 2))
colnames(df) <- c("Median","MyPrice")

df$NewPrice <- ifelse(df$MyPrice == 0 & df$MyPrice < df$Median, 1, 
                      ifelse(df$MyPrice == df$Median, 2, 
                             ifelse(df$MyPrice > df$Median, 3, 4)))
df$NewPrice[is.na(df$MyPrice)] <- 4
df
#  Median MyPrice NewPrice
#1     10       0        1
#2     20      18        4
#3     20      20        2
#4     30      35        3
#5     15      NA        4

答案 2 :(得分:0)

如何用4中的所有值设置一个新变量,然后替换那些符合您的条件的情况? 简单,直接,易于阅读:-)

#(以@Evans Friedland为例) df <-as.data.frame(matrix(c(10,0,20,18,20,20,30,35,15,NA),byrow = T,ncol = 2)) colnames(df)<-c(“ Median”,“ MyPrice”)

df <-mutate(df,myNewPrice = 4)#将新价格设置为4,然后根据您的条件进行编辑 df $ myNewPrice <-替换(df $ myNewPrice,df $ MyPrice == 0&df $ MyPrice df $ Median,3)

df $ myNewPrice <-as.numeric(df $ myNewPrice)#might,可能不需要。