R Назначение новой переменной на основе данных - PullRequest
0 голосов
/ 14 марта 2019

У меня есть данные, которые включают в себя аренду и поиски. Если поиск сделан тем же клиентом, который сделал аренду, и если поиск был сделан до аренды, я хочу назначить успешный поиск.

Вот часть моих данных.

time <- c("2019-03-13 14:43:00", "2019-03-13 14:34:00", "2019-03-13 14:23:00")
user <- c("A", "B", "A")
Type <- c("Rental","Search","Search")
data <- cbind(time, user, Type)

Мне нужен новый столбец, который показывает третью строку как успешную.

Но у меня много данных. Поэтому мне нужно сделать что-то вроде этого:

  • Если тип поиска и
  • Если есть аренда до 2 часов после поиска,
  • И если имя пользователя этого проката равно имени пользователя поиска

Тогда данные $ result <- "Successful" </p>

Ответы [ 2 ]

1 голос
/ 14 марта 2019

Я изменил ваши данные, потому что это не имело смысла с вашими инструкциями. Разница во времени - это момент времени, а не продолжительность. Так что вам нужна длительность или два балла. Также вы сказали, что имя пользователя проката равно имени пользователя поиска, но вы указали только одно имя. Независимо от того, как вы настроите if if, как вы описываете.

time <- c(1:3)
username <- c("A", "B", "A")
rentalname <- c("A", "B", "A")
Type <- c("Rental","Search","Search")
data <- data.frame(time, username, rentalname, Type)


data$result <- ifelse( 
    data$Type %in% "Search" & 
    data$time > 2 &
    data$username %in% data$rentalname, "Successful" ,"Failure")
0 голосов
/ 14 марта 2019

Если я хорошо понимаю, что вы хотите, это должно сработать (оно создает новый фрейм данных "success" с успешными записями):

# create new data frame
success <- data.frame(time=character(), user=character(), Type=character(), result=character(), stringsAsFactors=F)

count <- 1

# loop around each user
for(us in unique(data[,"user"])){

  # subset data per user
  subdata <- data[data[,"user"] == us, ]

  # skips the user if there is only one entry for that user or if there is no "Rental" entry in "Type"
  if(is.null(dim(subdata))) next;
  if(!is.null(dim(subdata)) & !any(subdata[,"Type"] == "Rental")) next;

  # sort subdata chronologically
  subdata <- subdata[order(subdata[,"time"]),]

  # loop around rows in the subdata
  for(i in 2:nrow(subdata)){

    # calculate the time difference between entries i and i-1 if i is a rental and i-1 a search
    if(difftime(subdata[i,"time"], subdata[i-1, "time"], units="mins") < 120 & subdata[i-1, "Type"] == "Search" & subdata[i, "Type"] == "Rental"){
      success[count,] <- c(subdata[i,], "success")
      count <- count +1
    }
  }
}

Это работает для той небольшой матрицы, которую вы дали, хотя вы бынужно попробовать и убедиться, что он работает правильно с большим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...