根据其他值添加列

时间:2010-10-12 22:49:35

标签: r

我有一个包含数百万行和三列标记为关键字,展示次数,点击次数的数据框。我想根据此函数的评估添加一个包含值的列:

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

通缉输出:

关键字,曝光,点击,键入
“你好”,0,0, “ZeroImp”
“世界”,1,0, “NoClicks”
“R”,34,23, “HasClicks”

3 个答案:

答案 0 :(得分:10)

在Joshua的解决方案的基础上,我发现在一次拍摄中生成Type更加清晰(请注意,这假设Clicks&gt; = 0 ...)

Mydf$Type = ifelse(Mydf$Impressions >= 1,
    ifelse(Mydf$Clicks >= 1, 'HasClicks', 'NoClicks'), 'ZeroImp')

答案 1 :(得分:3)

首先,函数中的if / else块将返回警告:

  

警告信息:
  在if(1:2> 2:3)中为TRUE,否则为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)

答案 2 :(得分:0)

这种算法可以比嵌套的ifelse语句更清晰,更可能更快。

再次以Joshua的解决方案为基础:

Mydf$Type <- factor(with(Mydf, (Impressions>=1)*2 + (Clicks>=1)*1),
                    levels=1:3, labels=c("ZeroImp","NoClicks","HasClicks"))