【问题标题】:Disaggregate one row of data to multiple rows将一行数据分解为多行
【发布时间】:2015-08-31 03:28:32
【问题描述】:

下午好!

我的数据集有问题。我正在使用 Google AdWords 导出数据进行数据分析,并且我想对数据拟合一个 logit 回归模型,以确定我进行的实验是否会影响转化。

问题在于数据是聚合的并且能够执行 logit 回归,因变量需要是二进制的。因此,我想要的不是具有(例如)10 次展示、5 次点击和 2 次转化的数据点,而是需要 10 个数据点,其中 5 个被点击,其中 2 个已转换。

所以我想从一个看起来像这样的数据框(非常简化)

| Keyword      | Impressions | Clicks     | Conversions |
| SampleName   |      10     |      5     |     2       |

到这里:

| Keyword      | Clicked     | Converted   |
| SampleName   |      1      |      1      |
| SampleName   |      1      |      1      |
| SampleName   |      1      |      0      |
| SampleName   |      1      |      0      |
| SampleName   |      1      |      0      |
| SampleName   |      0      |      0      |
| SampleName   |      0      |      0      |
| SampleName   |      0      |      0      |
| SampleName   |      0      |      0      |
| SampleName   |      0      |      0      |

对于一个非常大的数据集,我如何才能做到这一点?我到处寻找,但似乎找不到解决方案。我更喜欢使用 R 来执行此操作,但我也安装了 Excel 和 Stata。

提前致谢!

编辑 这是数据框的一些代码(扩展了额外的行和列)。我对 R 和这个平台很陌生。这可能不是最干净的编码方式,但在这里:

Key <- c("Sample1", "Sample2")
Imp <- c(10, 6)
Cli <- c(5, 3)
Con <- c(2, 1)
CPC <- c(0.26, 0.15)
df1 <- data.frame(Key, Imp, Cli, Con, CPC)
colnames(df1) <- c("Keyword", "Impressions", "Clicks", "Conversions", "CostPerClick")

另外,我现在遇到的问题是,每次点击的平均成本等事情需要重复点击,因为每次点击都会支付价格。所以最后,我需要一个如下所示的数据框:

| Keyword   | Clicked     | Converted   |     CPC     |
| Sample1   |      1      |      1      |     0.26    |
| Sample1   |      1      |      1      |     0.26    |
| Sample1   |      1      |      0      |     0.26    |
| Sample1   |      1      |      0      |     0.26    |
| Sample1   |      1      |      0      |     0.26    |
| Sample1   |      0      |      0      |     0.00    |
| Sample1   |      0      |      0      |     0.00    |
| Sample1   |      0      |      0      |     0.00    |
| Sample1   |      0      |      0      |     0.00    |
| Sample1   |      0      |      0      |     0.00    |
| Sample2   |      1      |      1      |     0.15    |
| Sample2   |      1      |      0      |     0.15    |
| Sample2   |      1      |      0      |     0.15    |
| Sample2   |      0      |      0      |     0.00    |
| Sample2   |      0      |      0      |     0.00    |
| Sample2   |      0      |      0      |     0.00    |

编辑 2(已解决)

在示例数据集上进行测试时,akrun 的解决方案似乎是正确的,但如果我尝试在我的实际数据集上进行测试,则会出现以下错误:

> result <- setDT(df1)[, list(Clicked=rep(c(1,0), c(Clicks, Impressions-Clicks)), 
+  Converted=rep(c(1,0), c(Conversions, Impressions-Conversions)), 
+  CPC=rep(c(CostPerClick, 0), c(Clicks,Impressions-Clicks))), Keyword]
Error in rep(c(1, 0), c(Clicks, Impressions - Clicks)) : 
  invalid 'times' argument

关键字不包含任何重复项且数据没有 NA:

> length(unique(df1$Keyword))
[1] 186145
> nrow(df1)
[1] 186145
> nrow(df1[complete.cases(df1),]) == nrow(df1)
[1] TRUE

数据摘要:

> summary(df1)
   Keyword           Impressions          Clicks        Conversions       CostPerClick  
 Length:186145      Min.   :   1.00   Min.   : 1.000   Min.   :0.00000   Min.   :0.010  
 Class :character   1st Qu.:   7.00   1st Qu.: 1.000   1st Qu.:0.00000   1st Qu.:0.130  
 Mode  :character   Median :  16.00   Median : 1.000   Median :0.00000   Median :0.210  
                    Mean   :  32.93   Mean   : 2.167   Mean   :0.03368   Mean   :0.246  
                    3rd Qu.:  39.00   3rd Qu.: 2.000   3rd Qu.:0.00000   3rd Qu.:0.320  
                    Max.   :1521.00   Max.   :91.000   Max.   :4.00000   Max.   :3.680 

【问题讨论】:

  • 您的问题已明确说明,但您应该显示一些代码的开头。
  • @ChipsLetten 谢谢,我是新来的,但我知道这很有帮助。我在编辑中包含了一些代码,以便您能够复制数据框。

标签: r excel statistics dataset google-ads-api


【解决方案1】:

试试

library(data.table)
setDT(df1)[, list(Clicked=rep(c(1,0), c(Clicks, Impressions-Clicks)),
 Converted=rep(c(1,0), c(Conversions, Impressions-Conversions))) , Keyword]
#       Keyword Clicked Converted
# 1: SampleName       1         1
# 2: SampleName       1         1
# 3: SampleName       1         0
# 4: SampleName       1         0
# 5: SampleName       1         0
# 6: SampleName       0         0
# 7: SampleName       0         0
# 8: SampleName       0         0
# 9: SampleName       0         0
#10: SampleName       0         0

更新

在 OP 的帖子中使用更新的数据集

setDT(df1)[, list(Clicked=rep(c(1,0), c(Clicks, Impressions-Clicks)), 
 Converted=rep(c(1,0), c(Conversions, Impressions-Conversions)), 
 CPC=rep(c(CostPerClick, 0), c(Clicks,Impressions-Clicks))), Keyword]
#    Keyword Clicked Converted  CPC
# 1: Sample1       1         1 0.26
# 2: Sample1       1         1 0.26
# 3: Sample1       1         0 0.26
# 4: Sample1       1         0 0.26
# 5: Sample1       1         0 0.26
# 6: Sample1       0         0 0.00
# 7: Sample1       0         0 0.00
# 8: Sample1       0         0 0.00
# 9: Sample1       0         0 0.00
#10: Sample1       0         0 0.00
#11: Sample2       1         1 0.15
#12: Sample2       1         0 0.15
#13: Sample2       1         0 0.15
#14: Sample2       0         0 0.00
#15: Sample2       0         0 0.00
#16: Sample2       0         0 0.00

数据

 df1 <- structure(list(Keyword = "SampleName", Impressions = 10L, 
 Clicks = 5L, 
 Conversions = 2L), .Names = c("Keyword", "Impressions", "Clicks", 
 "Conversions"), class = "data.frame", row.names = c(NA, -1L))

【讨论】:

  • 谢谢!这正是我的意思。我正在尝试将其应用于具有 21 个变量和 186145 个观察值的较大数据集。但是,我遇到了一些数字变量的问题。比如“平均每次点击费用”。对于 clicked = 1 应重复此操作,但对于 clicked = 0 这些应为零。有没有办法构建它?
  • @Charlotte 对不起,我没听懂你的描述。最好用一个小例子和你之前展示的预期结果来更新你的帖子。
  • 我刚刚编辑了我的帖子。我希望现在更清楚了。
  • @Charlotte 列名最好没有空格,即Cost_per_Click 可以。当你用read.csv/read.table读取数据集时,如果你不使用check.names=FALSE,它会去掉空格,替换成.左右。
  • 没有,但我终于找到了问题所在。有时点击次数 > 展示次数,然后它会给出错误。在不到 1% 的情况下会发生这种情况,通常是在关键字开始时没有获得很多展示时。删除这些实例可以解决问题,并且您的解决方案可以完美运行!谢谢!
猜你喜欢
  • 1970-01-01
  • 2017-02-12
  • 1970-01-01
  • 1970-01-01
  • 2021-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多