将汇总数据转换为单个级别的数据

时间:2019-08-07 13:20:38

标签: r logistic-regression

假设我有一个包含2列的数据集:

  visit   purchase
  5       2
  7       3

,我想将其转换为1列(用于logit回归分析) 在接下来的“购买”列中,1表示1次购买,0表示没有购买,购买中的观察总数等于访问总次数

我尝试过

df.expanded <- df[rep(row.names(df), pmax(df$Predators, 1)),]

from this question并成功扩展了观察范围。但是,在扩展行之后,我不知道如何转换“购买”列下的值,因为它看起来像这样

purchase
2
2
2
2
2
3
3
3
3
3
3
3

由于观察次数确实等于12,因此它也复制了购买次数。

我正在处理的数据集非常大,因此完全不可能手动进行。

新功能:

这是我原始数据集的一部分 https://i.stack.imgur.com/DByGX.png

在R中,数据帧被命名为“ try6”

因此,我在控制台中输入了此内容:

expand_01 <- function(x) {
  rep(c(1,0),
      c(x[["installs"]],x[["reach"]]-x[["installs"]]))
}
unlist(apply(try6,1,expand_01))

但是错误如下:

x [[“ reach”]]-x [[“ installs”]]中的错误:二进制运算符的非数字参数

我不明白,因为错误表明这些列下的值不是数字(?或我误解了),但是两列下只有数字。

谢谢您的帮助!

Classes ‘tbl_df’, ‘tbl’ and 'data.frame':   379 obs. of  7 variables:
 $ dow     : POSIXct, format: "2019-05-09" "2019-05-09" ...
 $ country : chr  "IT" "IT" "IT" "IT" ...
 $ adtype  : chr  "VID" "VID" "VID" "VID" ...
 $ age     : num  6 5 5 4 4 3 3 2 2 2 ...
 $ gender  : num  1 1 2 1 2 1 2 3 1 2 ...
 $ reach   : num  15 26 2 47 4 34 2 1 45 4 ...
 $ installs: num  0 0 0 0 0 1 0 0 0 0 ...

我放完

 try8 <- try6 %>% head() %>% select(reach,installs)

请参考这张图片:https://i.stack.imgur.com/IKggu.png

然后我放

 dput(try8)

它显示

 structure(list(reach = c(15, 26, 2, 47, 4, 34), installs = c(0, 
 0, 0, 0, 0, 1)), row.names = c(NA, -6L), class = c("tbl_df", 
 "tbl", "data.frame"))

names(try6) is 

[1] "dow"      "country"  "adtype"   "age"      "gender"   "reach"    "installs"

新图片

  reach <- try6$reach
  installs <- try6$installs

  new <- rep(0, sum(reach))

  for(j in 1:length(installs)){
  new[(sum(reach[0:(j-1)])+1):(sum(reach[0:(j-1)])+installs[j])] <- 1
  }

图片:https://i.stack.imgur.com/CXS22.png

有时也有例如4次安装,但是新结果给出5个1(例如5个观测值代替4个观测值)

图片:https://i.stack.imgur.com/Yc7tD.png

非常感谢!

2 个答案:

答案 0 :(得分:2)

您无需转换数据即可对其进行分析;您可以运行二项式回归

glm(cbind(purchase,visit-purchase) ~ x1 + x2 + x3 ..., 
          family=binomial(link="logit"),
          data= ...)

这在统计上等同于逻辑回归,并且效率更高!

如果您真的需要扩展到零和一...

dd <- read.table(header=TRUE,
text="
visit   purchase
  5       2
  7       3
")
## convert to tibble, just in case that makes a difference
dd <- tibble::as_tibble(dd)
expand_01 <- function(x) {
     rep(c(1,0),
         c(x[["purchase"]],x[["visit"]]-x[["purchase"]]))
}
unlist(apply(dd,1,expand_01))

答案 1 :(得分:0)

只是在for循环中使用索引作为替代...这不是很漂亮,但是:

visit <- c(5,7)
buy <- c(2,3)

new <- rep(0, sum(visit))

for(j in 1:length(buy)){
  new[(sum(visit[0:(j-1)])+1):(sum(visit[0:(j-1)])+buy[j])] <- 1
}
相关问题