假设我有一个包含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
非常感谢!
答案 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
}