根据第三列上的条件,将数据框中的值替换为另一列中的值

时间:2016-02-05 12:22:00

标签: r if-statement dataframe

我的数据框:

class     columnA

foo       10
bar       14.2
hello     48695
bar       4
foo       -7

我试图执行以下操作:

if (my_df$class== "foo") {
  my_df$columnB <- my_df$columnA * 2
}else{
  if (my_df$class == "bar") {
    my_df$columnB <- my_df$columnA * 5
  }else{
    my_df$columnB <- my_df$columnA * 10
  }
}
编辑:我也试过这个:

ifelse (my_df$class== "foo",
  my_df$columnB <- my_df$columnA * 2  
  ifelse (my_df$class== "bar",
    my_df$columnB <- my_df$columnA * 5,
    my_df$columnB <- my_df$columnA * 10
  )
)

由于它不起作用,让我用伪代码说明:

for each row, 
    if the value in column class is "foo"
         set the value in column B to be 2 times the value in column A
    if the value in column class is "bar"
         set the value in column B to be 5 times the value in column A
    if the value in column class is something else
         set the value in column B to be 10 times the value in column A

我的问题当然是使用分配运算符:如果我使用<-,整个columnB列最终会columnA乘以5(因为它是这样的)发生最后一行的class值为bar)。

任何解决方案?

我会采用一种解决方案来解决我的问题,而无需通过这种if/elseif/else语法,但如果有人能提供保持此语法的解决方案,我也非常感谢学习。

由于

3 个答案:

答案 0 :(得分:1)

使用dplyr包你可以这样做:

my_df <- my_df %>%
mutate(columnB = ifelse(class == "foo", columnA*2,
                 ifelse(class == "bar", columnA*5, columnA*10)
                 )
       )

答案 1 :(得分:1)

if未进行矢量化,因此您可以尝试使用ifelse

例如

my_df$columnB=ifelse(my_df$class== "foo",my_df$columnA * 2, 
                 ifelse(my_df$class == "bar",my_df$columnA * 5,my_df$columnA * 10))

答案 2 :(得分:1)

您也可以使用索引和数学的组合,而不是使用嵌套的ifelse

indx <- (mydf$class == "foo") + 1L + (mydf$class == "bar")*2
mydf$colB <- mydf$columnA*c(10, 2, 5)[indx]

给出:

> mydf
  class columnA   colB
1   foo    10.0     20
2   bar    14.2     71
3 hello 48695.0 486950
4   bar     4.0     20
5   foo    -7.0    -14