Запись столбца фрейма данных на основе нескольких столбцов
Как перекодировать столбец на основе значений из других столбцов? Скажем, у меня есть ниже кадр данных, и я хочу перекодировать 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
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
Это должно работать:
df[which(df$Col1=="x" & df$Col2=="a"),"Col3"] <- 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
не нужен, потому что вы бы перезаписывали исходные значения самими собой.
Вы можете установить подкадр данных с помощью скобок []. Формат выглядит следующим образом: df[условия или строки подмножеств, столбцы условий или подмножеств]
df[df$Col1==x & df$Col2==a, df$Col3] <- 0