如何根据其他列的值重新编码列?假设我有以下数据框,我想重新编码df$Col3
,以便df$Col1 == x
和df$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
答案 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
参数中的负值评估,因为您将自己覆盖原始值。