Запись столбца фрейма данных на основе нескольких столбцов

Как перекодировать столбец на основе значений из других столбцов? Скажем, у меня есть ниже кадр данных, и я хочу перекодировать 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
Другие вопросы по тегам