3

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

> 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

4 回答 4

4

您可以使用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
于 2013-04-11T19:52:22.407 回答
1

这应该有效:

df[which(df$Col1=="x" & df$Col2=="a"),"Col3"] <- 0
于 2013-04-11T19:52:10.610 回答
1

只需这样做:

> 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

于 2013-04-11T21:01:53.123 回答
0

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

df[df$Col1==x & df$Col2==a, df$Col3]  <- 0
于 2013-04-11T19:51:11.043 回答