добавление столбца на основе других значений - PullRequest
4 голосов
/ 13 октября 2010

У меня есть фрейм данных с миллионами строк и тремя столбцами, помеченными ключевыми словами, показами, кликами.Я хотел бы добавить столбец со значениями в зависимости от оценки этой функции:

isType <- function(Impressions, Clicks)
{ 
if (Impressions >= 1 & Clicks >= 1){return("HasClicks")} else if (Impressions >=1 & Clicks == 0){return("NoClicks")} else {return("ZeroImp")}
}

пока все хорошо.Затем я пытаюсь сделать это, чтобы создать столбец, но 1) он принимает навсегда и 2) он помечает, что все строки имеют «HasClicks», даже те, где он не должен.

# Creates a dataframe
Type <- data.frame()
# Loops until last row and store it in data.frame
for (i in c(1:dim(Mydf)[1])) {Type <- rbind(Type,isType(Mydf$Impressions[i], Mydf$Clicks[i]))}
# Add the column to Mydf
Mydf <- transform(Mydf, Type = Type)

входные данные:

Ключевые слова, показы, клики
"Привет", 0,0
"Мир", 1,0
"R", 34,23

Требуется вывод:

Ключевые слова, показы, клики, тип
"Hello", 0,0, "ZeroImp"
"World", 1,0, "NoClicks"
"R", 34,23,"HasClicks"

Ответы [ 3 ]

10 голосов
/ 13 октября 2010

Опираясь на решение Джошуа, я считаю более чистым генерировать Type за один выстрел (однако учтите, что это предполагает клики> = 0 ...)

Mydf$Type = ifelse(Mydf$Impressions >= 1,
    ifelse(Mydf$Clicks >= 1, 'HasClicks', 'NoClicks'), 'ZeroImp')
3 голосов
/ 13 октября 2010

Во-первых, блок if / else в вашей функции вернет предупреждение:

Предупреждающее сообщение:
В if (1: 2> 2: 3) TRUE else FALSE:
условие имеет длину> 1, и будет использоваться только первый элемент

, что объясняет, почему все строки одинаковы.

Во-вторых, вы должны выделить свой data.frame и заполнить элементы, а не многократно комбинировать объекты. Я полагаю, это вызывает у вас долгое время работы.

РЕДАКТИРОВАТЬ: мой общий код. Я бы хотел, чтобы кто-то предложил более элегантное решение.

Mydf <- data.frame(
  Keywords = sample(c("Hello","World","R"),20,TRUE),
  Impressions = sample(0:3,20,TRUE),
  Clicks = sample(0:3,20,TRUE) )

Mydf$Type <- "ZeroImp"
Mydf$Type <- ifelse(Mydf$Impressions >= 1 & Mydf$Clicks >= 1,
  "HasClicks", Mydf$Type)
Mydf$Type <- ifelse(Mydf$Impressions >= 1 & Mydf$Clicks == 0,
  "NoClicks", Mydf$Type)
0 голосов
/ 08 марта 2011

Это тот случай, когда арифметика может быть чище и, скорее всего, быстрее, чем вложенные ifelse операторы.

Снова опираясь на решение Джошуа:

Mydf$Type <- factor(with(Mydf, (Impressions>=1)*2 + (Clicks>=1)*1),
                    levels=1:3, labels=c("ZeroImp","NoClicks","HasClicks"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...