基于多列重新编码数据帧列

时间:2013-04-11 19:48:28

标签: r dataframe

如何根据其他列的值重新编码列?假设我有以下数据框,我想重新编码df$Col3,以便df$Col1 == xdf$Col2 == a时值为0。

> df <- data.frame(a=c(rep("x",3),rep("y",3),rep("x",4)),letters[c(1:5,3,4:1)],1:10)
> names(df)<-c("Col1","Col2","Col3")
> df
   Col1 Col2 Col3
1     x    a    1
2     x    b    2
3     x    c    3
4     y    d    4
5     y    e    5
6     y    c    6
7     x    d    7
8     x    c    8
9     x    b    9
10    x    a   10

4 个答案:

答案 0 :(得分:3)

您可以使用ifelse

> df$Col3  <- with(df, ifelse(Col1=='x' & Col2=='a', 0, Col3))
> df
   Col1 Col2 Col3
1     x    a    0
2     x    b    2
3     x    c    3
4     y    d    4
5     y    e    5
6     y    c    6
7     x    d    7
8     x    c    8
9     x    b    9
10    x    a    0

答案 1 :(得分:1)

这应该有效:

df[which(df$Col1=="x" & df$Col2=="a"),"Col3"] <- 0

答案 2 :(得分:0)

您可以使用[]括号对数据框进行子集化。    格式如下:df [条件或子集行,条件或子集列]

df[df$Col1==x & df$Col2==a, df$Col3]  <- 0

答案 3 :(得分:0)

这样做:

> df$Col3[df$Col1 == "x" & df$Col2 == "a"] <- 0

> df
   Col1 Col2 Col3
1     x    a    0
2     x    b    2
3     x    c    3
4     y    d    4
5     y    e    5
6     y    c    6
7     x    d    7
8     x    c    8
9     x    b    9
10    x    a    0

编辑: @Jilber

f1 <- function() 
  df$Col3[df$Col1 == "x" & df$Col2 == "a"] <- 0

f2 <- function() 
  df$Col3  <- with(df, ifelse(Col1=='x' & Col2=='a', 0, Col3))

library(microbenchmark)

> microbenchmark(f1(),f2(), times=1000)
Unit: microseconds
 expr    min     lq median     uq     max neval
 f1() 65.749 67.673 68.315 69.597 123.158  1000
 f2() 80.823 83.068 84.030 85.312 207.187  1000

我知道,没有什么不可思议的。您的方法,包括未满足条件时的替代值,只是更一般,因此有点慢。基本上,在这种情况下,不需要test ifelse参数中的负值评估,因为您将自己覆盖原始值。