Dplyr为sql表创建虚拟变量/指示符列

时间:2017-08-31 07:56:19

标签: r dplyr tidyr

<?php
$a1 = ['image 1', 'image 2'];
$a2 = [
    'name' => ['0.14997300-1503597010599f11d2249df30.jpg', '0.24654000-150113339659797a543c31f24.jpg'],
    'type' => ['image/jpeg', 'image/jpeg'],
    'tmp_name' => ['C:\Users\--\AppData\Local\Temp\php509E.tmp', 'C:\Users\--\AppData\Local\Temp\php509F.tmp'],
    'error' => [0, 0],
    'size' => [55560, 9425]
];

$result = [];
foreach ($a1 as $k => $v) {
    $result[] = [
        'text' => $v,
        'image_data' => array_combine(array_keys($a2), array_column($a2, $k))
    ];
}

print_r($result);

如何创建包含虚拟变量1和0的新列以指示行的观察。

我希望为列x

创建类似的内容
test <- data.frame(
  x=rep(letters[1:3],each=2),
  y=c(4,4,5,5,5,6)
)

  x y
1 a 4
2 a 4
3 b 5
4 b 5
5 c 5
6 c 6

或y列

  x y x_a x_b x_c
1 a 4   1   0   0
2 a 4   1   0   0
3 b 5   0   1   0
4 b 5   0   1   0
5 c 5   0   0   1
6 c 6   0   0   1

我设法在新列中使用ifelse在基础R中。

我希望在dplyr中执行此操作,以便它可以在sql表上运行。

  x y y_4 y_5 x_6
1 a 4   1   0   0
2 a 4   1   0   0
3 b 5   0   1   0
4 b 5   0   1   0
5 c 5   0   1   0
6 c 6   0   0   1

row_number()函数不适用于sql表。

错误:此数据库不支持窗口函数con <- DBI::dbConnect(RSQLite::SQLite(), path = "") dbWriteTable(con, "test",test) testdb <- tbl(con, "test") testdb %>% mutate(i = row_number(), i2 = 1) %>% spread(x, i2, fill = 0) 。我正在使用SQLite ..

1 个答案:

答案 0 :(得分:0)

对于x:

   library(dplyr)
   test %>% bind_cols(as_data_frame(setNames(lapply(unique(test$x), 
                                                    function(x){as.integer(test$x == x)}), 
                                             paste0('x_', unique(test$x)))))
      x y x_a x_b x_c
    1 a 4   1   0   0
    2 a 4   1   0   0
    3 b 5   0   1   0
    4 b 5   0   1   0
    5 c 5   0   0   1
    6 c 6   0   0   1

对于y:

test %>% bind_cols(as_data_frame(setNames(lapply(unique(test$y), 
                                                  function(x){as.integer(test$y == x)}), 
                                           paste0('y_', unique(test$y)))))
  x y y_4 y_5 y_6
1 a 4   1   0   0
2 a 4   1   0   0
3 b 5   0   1   0
4 b 5   0   1   0
5 c 5   0   1   0
6 c 6   0   0   1