获取更多R语言和生信知识,请欢迎关注公众号:医学和生信笔记

医学和生信笔记 公众号主要分享:1.医学小知识、肛肠科小知识;2.R语言和Python相关的数据分析、可视化、机器学习等;3.生物信息学学习资料和自己的学习笔记!

前几天介绍了宽数据变为长数据的5种情况,今天介绍长数据变为宽数据的例子。

文章目录

  • `pivot_wider`
    • capture-recapture data
    • 汇总功能
    • 从多个变量中生成列名
    • 整洁的数据
    • 隐式缺失值
    • 没用的列
    • 通讯录数据

pivot_wider

pivot_widerpivot_longer的反向操作,把长数据变为宽数据。宽数据一般不常用,但是在总结图表或者导入其他软件使用时很有用。

尤其是在做中药处方数据挖掘方面,非常有用!

capture-recapture data

使用fish_encounters数据集,这个数据记录了鱼游到水边会不会被检测到。

这个数据集非常实用,如果你做中医药处方数据挖掘相关工作,那么学会这个例子中的方法基本就是解决了大部分问题!

fish_encounters
## # A tibble: 114 x 3
##    fish  station  seen
##    <fct> <fct>   <int>
##  1 4842  Release     1
##  2 4842  I80_1       1
##  3 4842  Lisbon      1
##  4 4842  Rstr        1
##  5 4842  Base_TD     1
##  6 4842  BCE         1
##  7 4842  BCW         1
##  8 4842  BCE2        1
##  9 4842  BCW2        1
## 10 4842  MAE         1
## # ... with 104 more rows

许多分析都需要每一个工作站(station)是一列:

fish_encounters %>% pivot_wider(names_from = station,values_from = seen)
## # A tibble: 19 x 12
##    fish  Release I80_1 Lisbon  Rstr Base_TD   BCE   BCW  BCE2  BCW2   MAE   MAW
##    <fct>   <int> <int>  <int> <int>   <int> <int> <int> <int> <int> <int> <int>
##  1 4842        1     1      1     1       1     1     1     1     1     1     1
##  2 4843        1     1      1     1       1     1     1     1     1     1     1
##  3 4844        1     1      1     1       1     1     1     1     1     1     1
##  4 4845        1     1      1     1       1    NA    NA    NA    NA    NA    NA
##  5 4847        1     1      1    NA      NA    NA    NA    NA    NA    NA    NA
##  6 4848        1     1      1     1      NA    NA    NA    NA    NA    NA    NA
##  7 4849        1     1     NA    NA      NA    NA    NA    NA    NA    NA    NA
##  8 4850        1     1     NA     1       1     1     1    NA    NA    NA    NA
##  9 4851        1     1     NA    NA      NA    NA    NA    NA    NA    NA    NA
## 10 4854        1     1     NA    NA      NA    NA    NA    NA    NA    NA    NA
## 11 4855        1     1      1     1       1    NA    NA    NA    NA    NA    NA
## 12 4857        1     1      1     1       1     1     1     1     1    NA    NA
## 13 4858        1     1      1     1       1     1     1     1     1     1     1
## 14 4859        1     1      1     1       1    NA    NA    NA    NA    NA    NA
## 15 4861        1     1      1     1       1     1     1     1     1     1     1
## 16 4862        1     1      1     1       1     1     1     1     1    NA    NA
## 17 4863        1     1     NA    NA      NA    NA    NA    NA    NA    NA    NA
## 18 4864        1     1     NA    NA      NA    NA    NA    NA    NA    NA    NA
## 19 4865        1     1      1    NA      NA    NA    NA    NA    NA    NA    NA

这个数据集记录的是鱼是否被检测到,如果检测到就是1,所有你会发现长数据变为宽数据后出现了很多NA,但其实这些NA代表的是没被检测到。

对于这种数据,我们可以通过添加参数解决,把NA变成0:

fish_encounters %>% pivot_wider(names_from = station,values_from = seen,values_fill = 0 # 自动填充0
)
## # A tibble: 19 x 12
##    fish  Release I80_1 Lisbon  Rstr Base_TD   BCE   BCW  BCE2  BCW2   MAE   MAW
##    <fct>   <int> <int>  <int> <int>   <int> <int> <int> <int> <int> <int> <int>
##  1 4842        1     1      1     1       1     1     1     1     1     1     1
##  2 4843        1     1      1     1       1     1     1     1     1     1     1
##  3 4844        1     1      1     1       1     1     1     1     1     1     1
##  4 4845        1     1      1     1       1     0     0     0     0     0     0
##  5 4847        1     1      1     0       0     0     0     0     0     0     0
##  6 4848        1     1      1     1       0     0     0     0     0     0     0
##  7 4849        1     1      0     0       0     0     0     0     0     0     0
##  8 4850        1     1      0     1       1     1     1     0     0     0     0
##  9 4851        1     1      0     0       0     0     0     0     0     0     0
## 10 4854        1     1      0     0       0     0     0     0     0     0     0
## 11 4855        1     1      1     1       1     0     0     0     0     0     0
## 12 4857        1     1      1     1       1     1     1     1     1     0     0
## 13 4858        1     1      1     1       1     1     1     1     1     1     1
## 14 4859        1     1      1     1       1     0     0     0     0     0     0
## 15 4861        1     1      1     1       1     1     1     1     1     1     1
## 16 4862        1     1      1     1       1     1     1     1     1     0     0
## 17 4863        1     1      0     0       0     0     0     0     0     0     0
## 18 4864        1     1      0     0       0     0     0     0     0     0     0
## 19 4865        1     1      1     0       0     0     0     0     0     0     0

这样就很清楚了,1代表被检测到,0代表没被检测到。

这个数据也是中药处方数据挖掘中常用的频率矩阵。

汇总功能

pivot_wider支持简单的汇总功能,以下面的warpbreaks数据集为例,这是每个样本都有9个重复的实验设计:

warpbreaks <- warpbreaks %>% as_tibble() %>% select(wool, tension, breaks)warpbreaks
## # A tibble: 54 x 3
##    wool  tension breaks
##    <fct> <fct>    <dbl>
##  1 A     L           26
##  2 A     L           30
##  3 A     L           54
##  4 A     L           25
##  5 A     L           70
##  6 A     L           52
##  7 A     L           51
##  8 A     L           26
##  9 A     L           67
## 10 A     M           18
## # ... with 44 more rows
warpbreaks %>% count(wool, tension)
## # A tibble: 6 x 3
##   wool  tension     n
##   <fct> <fct>   <int>
## 1 A     L           9
## 2 A     M           9
## 3 A     H           9
## 4 B     L           9
## 5 B     M           9
## 6 B     H           9

假如我们想把tension这一列变为多列,会发生问题:

warpbreaks %>% pivot_wider(names_from = wool,values_from = breaks
)
## Warning: Values from `breaks` are not uniquely identified; output will contain list-cols.
## * Use `values_fn = list` to suppress this warning.
## * Use `values_fn = {summary_fun}` to summarise duplicates.
## * Use the following dplyr code to identify duplicates.
##   {data} %>%
##     dplyr::group_by(tension, wool) %>%
##     dplyr::summarise(n = dplyr::n(), .groups = "drop") %>%
##     dplyr::filter(n > 1L)
## # A tibble: 3 x 3
##   tension A         B
##   <fct>   <list>    <list>
## 1 L       <dbl [9]> <dbl [9]>
## 2 M       <dbl [9]> <dbl [9]>
## 3 H       <dbl [9]> <dbl [9]>

这段提示告诉我们:输出数据中一个单元格的值包含了多个输入数据的单元格值,上面的这个数据wooltension这两列,AL对应的breaks的值有多个,这样得到的结果每个单元格中是一个列表。可以通过传递一个函数解决:

warpbreaks %>% pivot_wider(names_from = wool,values_from = breaks,values_fn = list(breaks = mean))
## # A tibble: 3 x 3
##   tension     A     B
##   <fct>   <dbl> <dbl>
## 1 L        44.6  28.2
## 2 M        24    28.8
## 3 H        24.6  18.8

这样我们就得到了平均值,对于简答的汇总操作可以使用pivot_wider,但是对于复杂的操作还是建议先汇总再进行长宽转换。

长数据转换为宽数据就是需要每一行都有唯一标识符,不然就会有问题,如果不想汇总,也可以为每个观测添加唯一的标识符,然后再转换:

warpbreaks %>% mutate(row_id = row_number()) %>% pivot_wider(names_from = wool,values_from = tension)
## # A tibble: 54 x 4
##    breaks row_id A     B
##     <dbl>  <int> <fct> <fct>
##  1     26      1 L     <NA>
##  2     30      2 L     <NA>
##  3     54      3 L     <NA>
##  4     25      4 L     <NA>
##  5     70      5 L     <NA>
##  6     52      6 L     <NA>
##  7     51      7 L     <NA>
##  8     26      8 L     <NA>
##  9     67      9 L     <NA>
## 10     18     10 M     <NA>
## # ... with 44 more rows

从多个变量中生成列名

假如我们有一个数据集包含产品、国家、年,以tidy形式储存:

production <- expand.grid(product = c("A","B"),country = c("AI","EI"),year = 2000:2014
) %>% filter((product == "A" & country == "AI") | product == "B") %>% mutate(production = rnorm(nrow(.)))production
##    product country year   production
## 1        A      AI 2000 -0.087295557
## 2        B      AI 2000 -0.110905487
## 3        B      EI 2000  1.634681334
## 4        A      AI 2001 -0.388716367
## 5        B      AI 2001  1.331350645
## 6        B      EI 2001 -0.053276856
## 7        A      AI 2002 -0.479793652
## 8        B      AI 2002  0.420395500
## 9        B      EI 2002 -0.232220115
## 10       A      AI 2003 -1.216031488
## 11       B      AI 2003 -0.055353125
## 12       B      EI 2003  0.581777559
## 13       A      AI 2004  0.445017075
## 14       B      AI 2004  0.353079737
## 15       B      EI 2004 -0.335688514
## 16       A      AI 2005  3.121852854
## 17       B      AI 2005 -2.297172571
## 18       B      EI 2005  1.119929895
## 19       A      AI 2006 -0.140201867
## 20       B      AI 2006  0.804035254
## 21       B      EI 2006 -0.556100361
## 22       A      AI 2007  0.012777346
## 23       B      AI 2007  0.223261719
## 24       B      EI 2007  0.156248377
## 25       A      AI 2008 -0.635435270
## 26       B      AI 2008 -0.648780262
## 27       B      EI 2008  0.295025191
## 28       A      AI 2009  0.569436763
## 29       B      AI 2009  2.512097901
## 30       B      EI 2009 -0.937012717
## 31       A      AI 2010 -0.009918068
## 32       B      AI 2010 -0.328314663
## 33       B      EI 2010  1.581608640
## 34       A      AI 2011  0.497168601
## 35       B      AI 2011 -0.859256144
## 36       B      EI 2011  0.533496101
## 37       A      AI 2012 -0.246426907
## 38       B      AI 2012  1.600651171
## 39       B      EI 2012  1.978769369
## 40       A      AI 2013  1.074354159
## 41       B      AI 2013 -1.386956360
## 42       B      EI 2013  2.134569308
## 43       A      AI 2014  1.019885383
## 44       B      AI 2014  1.075803719
## 45       B      EI 2014 -1.732513618

想在我们想把这个数据集变成宽数据,其中一列包含productcountry两列的信息,我们该怎么办呢?

production %>% pivot_wider(names_from = c(product, country), # 直接放一起即可values_from = production
)
## # A tibble: 15 x 4
##     year     A_AI    B_AI    B_EI
##    <int>    <dbl>   <dbl>   <dbl>
##  1  2000 -0.0873  -0.111   1.63
##  2  2001 -0.389    1.33   -0.0533
##  3  2002 -0.480    0.420  -0.232
##  4  2003 -1.22    -0.0554  0.582
##  5  2004  0.445    0.353  -0.336
##  6  2005  3.12    -2.30    1.12
##  7  2006 -0.140    0.804  -0.556
##  8  2007  0.0128   0.223   0.156
##  9  2008 -0.635   -0.649   0.295
## 10  2009  0.569    2.51   -0.937
## 11  2010 -0.00992 -0.328   1.58
## 12  2011  0.497   -0.859   0.533
## 13  2012 -0.246    1.60    1.98
## 14  2013  1.07    -1.39    2.13
## 15  2014  1.02     1.08   -1.73

可以通过多个参数控制输出数据的列名:

production %>% pivot_wider(names_from = c(product, country),values_from = production,names_sep = ".",       # 连接符names_prefix = "prod." # 前缀
)
## # A tibble: 15 x 4
##     year prod.A.AI prod.B.AI prod.B.EI
##    <int>     <dbl>     <dbl>     <dbl>
##  1  2000  -0.0873    -0.111     1.63
##  2  2001  -0.389      1.33     -0.0533
##  3  2002  -0.480      0.420    -0.232
##  4  2003  -1.22      -0.0554    0.582
##  5  2004   0.445      0.353    -0.336
##  6  2005   3.12      -2.30      1.12
##  7  2006  -0.140      0.804    -0.556
##  8  2007   0.0128     0.223     0.156
##  9  2008  -0.635     -0.649     0.295
## 10  2009   0.569      2.51     -0.937
## 11  2010  -0.00992   -0.328     1.58
## 12  2011   0.497     -0.859     0.533
## 13  2012  -0.246      1.60      1.98
## 14  2013   1.07      -1.39      2.13
## 15  2014   1.02       1.08     -1.73

也可以通过names_glue函数:

production %>% pivot_wider(names_from = c(product, country),values_from = production,names_glue = "prod_{product}_{country}" # glue函数很好用
)
## # A tibble: 15 x 4
##     year prod_A_AI prod_B_AI prod_B_EI
##    <int>     <dbl>     <dbl>     <dbl>
##  1  2000  -0.0873    -0.111     1.63
##  2  2001  -0.389      1.33     -0.0533
##  3  2002  -0.480      0.420    -0.232
##  4  2003  -1.22      -0.0554    0.582
##  5  2004   0.445      0.353    -0.336
##  6  2005   3.12      -2.30      1.12
##  7  2006  -0.140      0.804    -0.556
##  8  2007   0.0128     0.223     0.156
##  9  2008  -0.635     -0.649     0.295
## 10  2009   0.569      2.51     -0.937
## 11  2010  -0.00992   -0.328     1.58
## 12  2011   0.497     -0.859     0.533
## 13  2012  -0.246      1.60      1.98
## 14  2013   1.07      -1.39      2.13
## 15  2014   1.02       1.08     -1.73

整洁的数据

us_rent_income数据集为例,这个数据集是关于美国2017年每个州的收入和租金。

us_rent_income
## # A tibble: 104 x 5
##    GEOID NAME       variable estimate   moe
##    <chr> <chr>      <chr>       <dbl> <dbl>
##  1 01    Alabama    income      24476   136
##  2 01    Alabama    rent          747     3
##  3 02    Alaska     income      32940   508
##  4 02    Alaska     rent         1200    13
##  5 04    Arizona    income      27517   148
##  6 04    Arizona    rent          972     4
##  7 05    Arkansas   income      23789   165
##  8 05    Arkansas   rent          709     5
##  9 06    California income      29454   109
## 10 06    California rent         1358     3
## # ... with 94 more rows

可以看到estimatemoe是值,我们可以把它们用作values_from的参数:

us_rent_income %>% pivot_wider(names_from = variable,values_from = c(estimate, moe),names_sep = ".")
## # A tibble: 52 x 6
##    GEOID NAME                 estimate.income estimate.rent moe.income moe.rent
##    <chr> <chr>                          <dbl>         <dbl>      <dbl>    <dbl>
##  1 01    Alabama                        24476           747        136        3
##  2 02    Alaska                         32940          1200        508       13
##  3 04    Arizona                        27517           972        148        4
##  4 05    Arkansas                       23789           709        165        5
##  5 06    California                     29454          1358        109        3
##  6 08    Colorado                       32401          1125        109        5
##  7 09    Connecticut                    35326          1123        195        5
##  8 10    Delaware                       31560          1076        247       10
##  9 11    District of Columbia           43198          1424        681       17
## 10 12    Florida                        25952          1077         70        3
## # ... with 42 more rows

函数会自动帮我们把列名连到一起,非常方便。

隐式缺失值

有时我们会遇到因子型数据,但不是所有的水平都有相应的值,例如下面这个数据:

weekdays <- c("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun")daily <- tibble(day = factor(c("Tue", "Thu", "Fri", "Mon"), levels = weekdays),value = c(2, 3, 1, 5)
)daily
## # A tibble: 4 x 2
##   day   value
##   <fct> <dbl>
## 1 Tue       2
## 2 Thu       3
## 3 Fri       1
## 4 Mon       5

可以看到day是因子型,且有7个水平,但不是所有的水平都显示出来了,假如我们想要都显示出来,也可以办到:

daily %>% pivot_wider(names_from = day,values_from = value,names_expand = T # 所有水平都显示出来
)
## # A tibble: 1 x 7
##     Mon   Tue   Wed   Thu   Fri   Sat   Sun
##   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1     5     2    NA     3     1    NA    NA

假如names_from含有多列,那么函数会自动组合所有可能:

percentages <- tibble(year = c(2018, 2019, 2020, 2020),type = factor(c("A", "B", "A", "B"), levels = c("A", "B")),percentage = c(100, 100, 40, 60)
)percentages
## # A tibble: 4 x 3
##    year type  percentage
##   <dbl> <fct>      <dbl>
## 1  2018 A            100
## 2  2019 B            100
## 3  2020 A             40
## 4  2020 B             60

接下来变为宽数据:

pivot_wider(percentages,names_from = c(year, type), # 多列values_from = percentage,names_expand = TRUE, # 自动给出所有组合values_fill = 0 # 没有的填充0
)
## # A tibble: 1 x 6
##   `2018_A` `2018_B` `2019_A` `2019_B` `2020_A` `2020_B`
##      <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>
## 1      100        0        0      100       40       60

上面这种情况是names含有因子型,另一种相似的情况是id_cols(可以简单理解为能够区分不同行数据的唯一标识符列)含有隐式缺失值(因子型),这种情况下需要用id_expand

daily <- daily %>% mutate(type = factor(c("A","B","B","A")))
daily
## # A tibble: 4 x 3
##   day   value type
##   <fct> <dbl> <fct>
## 1 Tue       2 A
## 2 Thu       3 B
## 3 Fri       1 B
## 4 Mon       5 A

接下来变为宽数据:

daily %>% pivot_wider(names_from = type,values_from = value,id_expand = T)
## # A tibble: 7 x 3
##   day       A     B
##   <fct> <dbl> <dbl>
## 1 Mon       5    NA
## 2 Tue       2    NA
## 3 Wed      NA    NA
## 4 Thu      NA     3
## 5 Fri      NA     1
## 6 Sat      NA    NA
## 7 Sun      NA    NA

但是其实不用也是不会报错的:

daily %>% pivot_wider(names_from = type,values_from = value)
## # A tibble: 4 x 3
##   day       A     B
##   <fct> <dbl> <dbl>
## 1 Tue       2    NA
## 2 Thu      NA     3
## 3 Fri      NA     1
## 4 Mon       5    NA

没用的列

有些数据中的某一列对于长宽转换是没用的,但是这一列你又不想丢掉,这种情况可以使用unused_fn搞定。

updates <- tibble(county = c("Wake", "Wake", "Wake", "Guilford", "Guilford"),date = c(as.Date("2020-01-01") + 0:2, as.Date("2020-01-03") + 0:1),system = c("A", "B", "C", "A", "C"),value = c(3.2, 4, 5.5, 2, 1.2)
)updates
## # A tibble: 5 x 4
##   county   date       system value
##   <chr>    <date>     <chr>  <dbl>
## 1 Wake     2020-01-01 A        3.2
## 2 Wake     2020-01-02 B        4
## 3 Wake     2020-01-03 C        5.5
## 4 Guilford 2020-01-03 A        2
## 5 Guilford 2020-01-04 C        1.2

现在我们想把system这一列进行转换:

updates %>% pivot_wider(names_from = system,values_from = value,id_cols = county)
## # A tibble: 2 x 4
##   county       A     B     C
##   <chr>    <dbl> <dbl> <dbl>
## 1 Wake       3.2     4   5.5
## 2 Guilford   2      NA   1.2

这样虽然不会报错,但是date那一列的信息就完全丢失了。

我们可以通过使用unused_fn进行调整,比如我们可以通过函数保留最新的日期:

updates %>% pivot_wider(id_cols = county,names_from = system,values_from = value,unused_fn = list(date = max))
## # A tibble: 2 x 5
##   county       A     B     C date
##   <chr>    <dbl> <dbl> <dbl> <date>
## 1 Wake       3.2     4   5.5 2020-01-03
## 2 Guilford   2      NA   1.2 2020-01-04

这样就保留了最新的日期。

也可以直接把date列变为列表形式保存下来:

updates %>% pivot_wider(id_cols = county,names_from = system,values_from = value,unused_fn = list(date = list) # 神奇的操作!)
## # A tibble: 2 x 5
##   county       A     B     C date
##   <chr>    <dbl> <dbl> <dbl> <list>
## 1 Wake       3.2     4   5.5 <date [3]>
## 2 Guilford   2      NA   1.2 <date [2]>

通讯录数据

假如我们有一个下面这样的通讯录数据:

contacts <- tribble(~field, ~value,"name", "Jiena McLellan","company", "Toyota", "name", "John Smith", "company", "google", "email", "john@google.com","name", "Huxley Ratcliffe"
)contacts
## # A tibble: 6 x 2
##   field   value
##   <chr>   <chr>
## 1 name    Jiena McLellan
## 2 company Toyota
## 3 name    John Smith
## 4 company google
## 5 email   john@google.com
## 6 name    Huxley Ratcliffe

这个数据没有任何一列能够区分每一行怎么分组。

我们可以创建一个新列,每当field这一列出现name时,就加一。

contacts <- contacts %>% mutate(person_id = cumsum(field == "name"))
contacts
## # A tibble: 6 x 3
##   field   value            person_id
##   <chr>   <chr>                <int>
## 1 name    Jiena McLellan           1
## 2 company Toyota                   1
## 3 name    John Smith               2
## 4 company google                   2
## 5 email   john@google.com          2
## 6 name    Huxley Ratcliffe         3

这样操作以后每个人就都有了唯一的标识符。这样就可以把fieldvalue这两列进行pivot了。

contacts %>% pivot_wider(names_from = field,values_from = value)
## # A tibble: 3 x 4
##   person_id name             company email
##       <int> <chr>            <chr>   <chr>
## 1         1 Jiena McLellan   Toyota  <NA>
## 2         2 John Smith       google  john@google.com
## 3         3 Huxley Ratcliffe <NA>    <NA>

以上就是常见的长变宽的7种情况,明天继续介绍更加复杂的长宽转换例子。

获取更多R语言和生信知识,请欢迎关注公众号:医学和生信笔记

医学和生信笔记 公众号主要分享:1.医学小知识、肛肠科小知识;2.R语言和Python相关的数据分析、可视化、机器学习等;3.生物信息学学习资料和自己的学习笔记!

使用pivot_longer和pivot_wider进行长宽数据转换相关推荐

  1. R语言进行长宽数据转换

    长宽数据 在日常数据分析过程中,经常会对数据进行长宽转换处理,所谓长宽数据转换就是将数据表中的列变量进行聚合和分裂操作.宽转长:多个列聚合为一列,同时生成value值,这种操作主要是为了方便ggplo ...

  2. 推荐两个长宽数据互换函数pivot_longer和pivot_wider

    长宽数据转换有reshape(真难用),reshape2,cast,melt,spread,gather后两项非常简单易用,pivot_longer和pivot_wider,更强劲,在数据重组过程中还 ...

  3. 昆虫基因组DNA的优化提取,可进行长读测序

    昆虫基因组DNA的优化提取,可进行长读测序 通过 布伦达·奥珀特(Brenda Oppert) 1,*, 萨曼莎·斯托斯(Samantha Stoss) 1个, 阿莱莎和尚 1个 和 蒂莫西·史密斯 ...

  4. qt websocket android,QT使用websocket进行长连接

    一般我们用的最多的就是http请求,但是频繁的请求可能对服务造成的压力很大,所以今天谈谈websocket长连接,一句话:简单 1.什么是长连接? A:一次请求连接,终身使用,就可以长久的保持信息的交 ...

  5. Android 后台进行长图的生成并分享(非长截图)

    DrawLongPictureDemo 项目地址:SherlockGougou/DrawLongPictureDemo  简介:Android 后台进行长图的生成并分享(非长截图) 更多:作者   提 ...

  6. 利用opencv对图像进行长曝光

    利用opencv对图像进行长曝光 本文首发于公众号[Opencv视觉实践],翻译自光头哥哥的博客: [Long exposure with OpenCV and Python],仅做学习分享. 原文链 ...

  7. 如何用苹果手机进行长截图,自带3种截屏方式,任你随意挑选

    每一款手机都各有优缺点.当我们将苹果手机与安卓手机进行对比的时候,就会发现,安卓手机很容易就能进行长截图,方式非常简单.而苹果手机的操作就相对麻烦一些,那么我们该如何解决苹果手机长截图这个问题呢? 1 ...

  8. .xhr长轮询_使用Spring 3.2的DeferredResult进行长轮询

    .xhr长轮询 在我们的最后一集中 , Agile Cowboys Inc.的首席执行官刚刚雇用了Java / Spring顾问,方法是为他提供最初为女友购买的保时捷. 这位首席执行官的女友因失去保时 ...

  9. 使用Spring 3.2的DeferredResult进行长轮询

    在我们的最后一集中 , Agile Cowboys Inc.的首席执行官刚刚雇用了Java / Spring顾问,方法是为他提供最初为女友购买的保时捷. 这位首席执行官的女友因失去保时捷而感到不安,已 ...

最新文章

  1. 第四章 DOM节点操作
  2. 面试官:给我说一下 Spring MVC 拦截器的原理?
  3. matlab电力系统潮流计算,大神们,求个电力系统潮流计算的matlab程序。
  4. 内置的进制转换的方法---小笔记
  5. 通过document id和content拿到SAP document的binary data
  6. abp vue如何配置服务地址_DHCP服务如何配置才能尽量减少被攻击的可能
  7. Linux系统centos7+VMwareWorkstation创建共享文件夹错误解决方法集锦
  8. Vite 配置项目别名-最新版
  9. 计算机的照相机功能,让我来告诉你单反相机那10项不可思议的功能!
  10. 刮刮卡 java代码_Android刮刮卡效果实现代码
  11. mysql 裸设备_什么叫做裸设备
  12. MySQL查看锁及事务隔离级别的命令
  13. 网站建设多少钱(做一个网站需要多少钱)
  14. python能处理nc文件吗_利用python如何处理nc数据详解
  15. 缺少vcruntime140d.dll的解决办法
  16. 本源量子与德美牵头成立产业联盟,生物化学正式进入量子计算“赛道”|现场专访
  17. FreeRDP 2.0 for Windows 编译
  18. 文明重启战局服务器维护中是什么意思,文明重启为什么改了密码别人还能登?...
  19. sap docking 简单分屏alv
  20. 360开源mysql_奇虎360开源基于Kubernetes管理平台 Wayne

热门文章

  1. Apache安装配置(Windows和Linux)-有手就行
  2. nextval数组求解
  3. 今天发现的一个好的学习php的网站
  4. 图片加水印、压缩,用thumbnails
  5. 免费泛域名证书怎么申请?
  6. Android 完美获取Ip地址
  7. tinyint你mysql_MySQL中的tinyint
  8. springboot毕设项目多层级架构的工程项目安全监管系统的设计与实现tx75u(java+VUE+Mybatis+Maven+Mysql)
  9. 【克罗地亚】LAGNO
  10. 请求被pending,pending是什么意思?