2013-04-11 5 views
2

Как перекодировать столбец на основе значений из других столбцов? Скажем, у меня есть следующий фрейм данных, и я хочу перекодировать df$Col3, так что значение равно 0, если df$Col1 == x и df$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 

ответ

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 
+0

Элегантный, но довольно медленный ... особенно из-за ifelse – Michele

+0

@Michele Что значит «довольно медленно»? Вы оценили? 'ifelse' является векторизованной функцией R, так что вы можете объяснить, что такое« довольно медленно »? –

+0

Привет, это не совсем «медленно». Пожалуйста, проверьте EDIT в моем ответе. – Michele

0

Вы можете подмножить рамку данных с помощью скобок []. Формат выглядит так: ДФ [условий или подмножества строк, состояние или подмножества столбцов]

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

Это должно работать:

df[which(df$Col1=="x" & df$Col2=="a"),"Col3"] <- 0 
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 

EDIT: @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 

Ничего невероятно, я знаю. Ваш метод, в том числе альтернативное значение, когда условие не выполняется, является более общим и, следовательно, немного медленнее. В принципе, в этом случае оценка отрицательных значений в параметре testifelse не требуется, потому что вы сами перезаписываете исходные значения.

Смежные вопросы