合并相同數據的行_R語言筆記(六):數據框重塑(reshape2)

db070b1d5dfa0642ede52be35b4ee627.png

數據處理主要內容包括:

  • 1. 特殊值處理
    • 1.1 缺失值
    • 1.2 離群值
    • 1.3 日期
  • 2. 數據轉換(base vs. dplyr)
    • 2.1 篩選(subset vs. filter/select/rename)
    • 2.2 排序(order vs. arrange)
    • 2.3 轉換(transform vs. mutate/transmute)
    • 2.4 分組與概括(group_by/summarise)
  • 3. 數據框重塑(base vs. dplyr)
    • 3.1 數據框的合并(rbind/cbind vs. bind_rows/bind_cols)
    • 3.2 數據框的關聯(merge vs. *_ join)
    • 3.3 數據框的長寬轉換(reshape2 包)

本文我們學習數據框重塑的有關內容。前文鏈接:

Sub-woo:R語言筆記(四):數據處理(上)?zhuanlan.zhihu.com
865e1921db6eafaf7012d6063ca18330.png
Sub-woo:R語言筆記(四):數據處理(中)?zhuanlan.zhihu.com
4f127d6dc1540aa059c06d546fbe6847.png

有出錯或補充的地方請大神們不吝賜教,作者會持續更新!


3. 數據框重塑

這篇文章我們主要介紹基本包和 dplyr 包中用于數據框操作的函數,包括多個數據框的合并、關聯以及長寬數據框的轉換。

字符串的拼接可以通過 paste() 函數實現,而多個數據框也同樣可以通過函數合成為一個數據框。與字符串不同的是,多個數據框的合成方式有兩種,一種是合并(父母之命,媒妁之言),另一種是關聯(相信緣分,因為愛情)。以下是段子,沒興趣的小伙伴可以跳過。

【段子:如何理解合并是“父母之命,媒妁之言”?這幾個要合并的數據框往往沒有相同的行或者列,我們只想硬生生地把它們拼成一個整體而已,或者說它們在一起不是因為相互有什么相同點,只是因為我們(父母)想[doge]。】

【段子:那又如何理解關聯是“因為愛情”呢?需要關聯的數據框往往具有某些相同的行或者列,比如有兩份數據框,一份是小明和小紅的數學成績,另一份是小明和小紅的英語成績,很顯然兩份數據框都有相同的人名,因此我們就可以將二者關聯,形成一份體現小明和小紅數學、英語成績的成績單。這些相同的行或列就好比緣分和愛情,正因為有了共同點,數據框們才能更緊密地結合,更幸福地生活=。=】

3.1 數據框的合并(rbind/cbind vs. bind_rows/bind_cols)

  • base 包(rbind/cbind)

base 包提供的實現合并的函數有兩個,分別是:

rbind()
# 縱向合并
cbind()
# 橫向合并

【注】rbind() 要求數據框的列數相同,同時列名也要一致;cbind() 要求數據框的行數相同。舉幾個例子:

set1 <- data.frame(a = 1: 4, b = LETTERS[1: 4])
set2 <- data.frame(a = 0, b = c("I", "love", "u"), c = c(5, 2, 0))set1 # 4×2 的數據框
#   a b
# 1 1 A
# 2 2 B
# 3 3 C
# 4 4 D
set2 # 3×3 的數據框
#   a    b c
# 1 0    I 5
# 2 0 love 2
# 3 0    u 0# rbind(set1, set2) 列數不相同會報錯
# cbind(set1, set2) 行數不相同會報錯rbind(set1, set2[, 1:3]) # 只取 set2 的前兩列,使得列數與 set1 相同
#   a    b
# 1 1    A
# 2 2    B
# 3 3    C
# 4 4    D
# 5 0    I
# 6 0 love
# 7 0    u
cbind(set1[1: 3, ], set2) # 只取 set1 的前三行,使得行數與 set2 相同a b a    b c
1 1 A 0    I 5
2 2 B 0 love 2
3 3 C 0    u 0
# 合并出現了兩個 a 列

【注】使用 cbind() 合并數據框后,可能出現列名相同的情況,某種程度上算是 cbind() 的缺陷,因此作者也更傾向于使用 dplyr 包提供的合并函數。

  • dplyr 包(bind_rows/bind_cols)

dplyr 包提供的數據框合并函數也有兩個,分別是:

bind_rows()
# 縱向拼接
bind_cols()
# 橫向拼接

【注】bind_rows() 根據列名對數據框進行合并,同一列名的列進行合并,不同列名的列會自動進行補齊(默認使用 NA 補齊),最好保證相同列名的數據類型是一致的;bind_cols() 要求數據框的行數相同,若有相同列名,則會自動進行修改區分。接下來舉例說明:

library(dplyr)
one <- data.frame(a = c("I", "love", "U"), b = 0, c = c(5, 2, 0), stringsAsFactors = F)
two <- data.frame(a = c("13", "14"), d = LETTERS[1: 2], stringsAsFactors = F)
# 保證 two 的 a 列數據類型與 one 的 a 列一致,均為字符型one # 3×3 數據框
#      a b c
# 1    I 0 5
# 2 love 0 2
# 3    U 0 0
two # 3×3 數據框
#    a d
# 1 13 A
# 2 14 Bbind_rows(one, two)
#      a  b  c    d
# 1    I  0  5 <NA>
# 2 love  0  2 <NA>
# 3    U  0  0 <NA>
# 4   13 NA NA    A
# 5   14 NA NA    B
# 可以看到,bind_rows() 對相同列名的數據進行了合并,列名不同的列則自動使用 NA 進行了補齊。# bind_cols(one, two) 報錯,兩個數據框行數不一致
bind_cols(one[1:2, ], two)
#      a b c a1 d
# 1    I 0 5 13 A
# 2 love 0 2 14 B
# 自動對相同的列名進行了修改

3.2 數據框的關聯(merge vs. *_ join)

  • base 包(merge)

基本包提供的數據框關聯函數為 merge() ,能夠根據兩個數據框相關的列進行關聯,附上參考資料:R語言使用merge函數匹配數據(vlookup,join),語法如下:

merge(x, y, by = intersect(names(x), names(y)),by.x = 列名1, by.y = 列名2, all = FALSE, all.x = all, all.y = all,sort = TRUE, suffixes = c(".x",".y"), no.dups = TRUE,incomparables = NULL, ...)
x,y:要合并的兩個數據集
by:用于連接兩個數據集的列,intersect(a,b)值向量a,b的交集,names(x)指提取數據集x的列名
by:intersect(names(x), names(y)) 是獲取數據集x,y的列名后,提取其公共列名,作為兩個數據集的連接列, 當有多個公共列時,需用下標指出公共列,如names(x)[1],指定x數據集的第1列作為公共列。也可以直接寫為 by = "公共列名" ,前提是兩個數據集中都有該列名,并且大小寫完全一致,R語言區分大小寫
by.x,by.y:指定依據哪些列關聯數據框,默認值為相同列名的列
all,all.x,all.y:指定x和y的行是否應該全在輸出文件
sort:by指定的列(即公共列)是否要排序
suffixes:指定除by外相同列名的后綴;如設置 suffixes = c(".xx", ".yy"),兩個數據框都有列名 grade,關聯后就會被區分為 grade.xx 和 grade.yy
incomparables:指定by中哪些單元不進行關聯

其中,常用的參數有 by(根據相同列名的列進行關聯);by.x/by.y(可以分別指定兩個數據框的列進行關聯);all/all.x/all.y(邏輯變量,控制返回 x 和 y 所有/僅 x 數據框/僅 y 數據框的行);sort(邏輯變量,根據關聯的列進行排序)。

下面舉例說明:

grade1 <- data.frame(number = c(2, 3, 1), Names = c("小明", "小紅", "小李"), math = c(90, 80, 100))
grade2 <- data.frame(number = c(3, 1, 4), NAMES = c("小紅", "小李", "小張"), english = c(100, 90, 80))
grade3 <- data
# 兩個數據框定義了學號、姓名和成績
grade1
#   number Names math
# 1      2  小明   90
# 2      3  小紅   80
# 3      1  小李  100
grade2
#   number NAMES english
# 1      3  小紅     100
# 2      1  小李      90
# 3      4  小張      80merge(grade1, grade2)
#   number Names math NAMES english
# 1      1  小李  100  小李      90
# 2      3  小紅   80  小紅     100

默認條件下,根據兩個數據框相同列名的列(學號)進行關聯,由于 Names 和 NAMES 大小寫不一致,因此不會關聯該列;只保留兩個數據框的交集部分(共有的),省略了小明和小張的數據。我們可以通過 by.x/by.y 分別指定需要關聯的列名:

merge(grade1, grade2, by.x = c("number", "Names"), by.y = c("number", "NAMES"))
#   number Names math english
# 1      1  小李  100      90
# 2      3  小紅   80     100

這樣就實現了通過學號和姓名進行數據框的關聯。接下來我們通過 all/all.x/all.y 指定保留我們想要的行:

merge(grade1, grade2, by.x = c("number", "Names"), by.y = c("number", "NAMES"),all = T) # 返回并集(保留所有行)
#   number Names math english
# 1      1  小李  100      90
# 2      2  小明   90      NA
# 3      3  小紅   80     100
# 4      4  小張   NA      80
# 使用 NA 填補了缺失值merge(grade1, grade2, by.x = c("number", "Names"), by.y = c("number", "NAMES"),all.x = T) # 僅保留 x 數據框的所有行
#   number Names math english
# 1      1  小李  100      90
# 2      2  小明   90      NA
# 3      3  小紅   80     100
# 保留了 x 的所有行,因此小明的成績被留下了merge(grade1, grade2, by.x = c("number", "Names"), by.y = c("number", "NAMES"),all.y = T) # 僅保留 y 數據框的所有行
# 大家猜猜看結果

最后我們通過 sort 對關聯的變量進行排序,默認 sort = T,將 by 中的第一個變量作為第一依據,第二個變量作為第二依據,以此類推進行排序。注意觀察下述代碼與之前的差異:

merge(grade1, grade2, by.x = c("Names", "number"), by.y = c("NAMES", "number"),all = T)
#   Names number math english
# 1  小紅      3   80     100
# 2  小李      1  100      90
# 3  小明      2   90      NA
# 4  小張      4   NA      80

可以看到,將 by 中 names 移到首位后,排序方式也發生了變化——根據姓名升序排列。

  • dplyr 包(* _ join)

dplyr 包提供的關聯數據框的函數包括以下幾種:

inner_join(x, y, by = , copy = F, suffix = c(), ...)
# 返回交集
left_join(x, y, by = , copy = F, suffix = c(), ...)
# 返回 x 所有的行數據與交集,類似 merge 中 all.x = T
right_join(x, y, by = , copy = F, suffix = c(), ...)
# 返回 y 所有的行數據與交集,類似 all.y = T
full_join(x, y, by = , copy = F, suffix = c(), ...)
# 返回并集(所有數據),類似 all = T
semi_join(x, y, by = , copy = F)
# 保留 x 所有的列名,返回行的交集
anti_join(x, y, by = , copy = F)
# 保留 x 所有的列名,返回行的 x 與 !y 的交集(從 x 中剔除與 y 匹配的行)

【注】by 可以賦值行名,也可以通過 by = c("列名1" = "列名2", ...) 進行指定;suffix 的功能與 merge 中的 suffixes 類似。下面介紹一下 semi_ join() 與 anti_ join() 的效果:

grade1 <- data.frame(number = c(2, 3, 1), Names = c("小明", "小紅", "小李"), math = c(90, 80, 100))
grade2 <- data.frame(number = c(3, 1, 4), NAMES = c("小紅", "小李", "小張"), english = c(100, 90, 80))
# 繼續使用上面的數據框semi_join(grade1, grade2)
# Joining, by = "number"
#   number Names math
# 1      3  小紅   80
# 2      1  小李  100inner_join(grade1, grade2) # 對比交集
#   number Names math NAMES english
# 1      3  小紅   80  小紅     100
# 2      1  小李  100  小李      90

觀察到 semi_ join 保持了 grade1 的表格形式,數據則是 grade1 與 grade2 的交集,因此也可以理解為將數據的交集填入形如 grade1 的表格中。anti_ join 也是類似的效果:

anti_join(grade1, grade2)
# Joining, by = "number"
#   number Names math
# 1      2  小明   90

返回的數據是 grade1 中除去了與 grade2 共有的部分(即 x & !y,或者是

),填入形如 grade1 的表格中。

3.3 數據框的長寬轉換(reshape2 包)

  • 什么是長數據/寬數據

首先聊聊什么是長數據和寬數據。作者是這樣理解的,長數據的格式可以較為籠統地認為只有三列,一列用于存儲索引值,一列用于存儲 variable,最后一列用于存儲 value【類似于映射,第一列對應坐標,第二列對應映射方式(函數),第三列對應函數值(value)】。只是當索引值以多個維度存在的時候,就會出現四列甚至更多,舉個例子,將日期作為索引值,最高溫/最低溫作為 variable,溫度值作為 value 存儲時,數據框就可能是如下類型:

5e1e61835201b2e1d41e5c872c497338.png
2020/1/6 缺少最低溫,但在長數據中不會體現出來

當索引值以更高維度表現時,如將日期格式的年/月/日分開書寫,就會是下面的樣子:

85c502c7a726920909b7fa857222ca39.png

那寬數據又是什么樣的呢?類似于長數據,可以籠統地認為寬數據只有兩行,第一行用于存儲變量名,第二行用于存儲每個變量名對應的 value(列向量的形式存在),我們平時觀察的表格往往就是寬數據的形式。同樣使用溫度的數據,其寬數據的表現形式就像下面的表格:

a75620612ee2ab7a449b3576fca62c15.png
在寬數據格式下,缺失值會被體現出來

是不是看起來親切很多?

兩種格式各有優點,多數時候長數據的存儲占用空間比寬數據小(從缺失值可以大概領會一點),長數據的增刪讀取比寬數據效率更高;寬數據在形式上更清晰,而且由于其 value 是以列向量的形式存在,也能更好地適應 R 語言大多函數的調用

  • 長寬數據轉換的代碼實現

基本包中的 reshape/stack/unstack 函數可以實現長寬數據的轉換,但使用起來比較麻煩,現在很少有人使用,目前使用比較多的是 tidyr 包中的 gather/spread 函數和 reshape2 包中的 melt/dcast 函數。本篇文章只介紹 reshape2 包中轉換數據框長寬數據的函數(只會這個...):

melt(data, id.vars, measure.vars,variable.name = "variable", ..., na.rm = FALSE, value.name = "value",factorsAsStrings = TRUE)
# 將寬數據轉換為長數據dcast(data, formula, fun.aggregate = NULL, ..., margins = NULL,subset = NULL, fill = NULL, drop = TRUE,value.var = guess_value(data))
# 將長數據轉換為寬數據

在 melt() 中,id.vars(亦作 id ) 對應長數據的第二列(映射方式/函數);measure.vars(亦作 measure ) 對應長數據的第三列(value/函數值);variable.name 指定第二列的列名;value.name 指定第三列的列名;na.rm = F 不移除缺失值,為 T 則移除缺失值;factorsAsStrings = T 將因子轉換為字符串,為 F 則不轉換。

在 dcast() 中,formula 的形式為 x_variable + x_2 ~ y_variable + y_2 ~ z_variable ~ ...,左端對應寬數據中的索引值,右端對應寬數據中的 variable 和 value;fun.aggregate 用于指定函數,若對應某個索引值的 value 個數多于一個,則需要通過 fun.aggregate 函數處理這些 values,使之聚合為一個 value(每個 x 有且僅有一個 y 值與之對應,才能成為映射),如函數 sum/mean/sd 等;fill 指定填補缺失值,默認用 fun.aggregate 函數對空向量返回的值填補。

下面用 R 自帶的 airquality 數據集舉例說明:

library(reshape2)
dat <- airquality
head(dat) # 顯示前六條數據
#   Ozone Solar.R Wind Temp Month Day
# 1    41     190  7.4   67     5   1
# 2    36     118  8.0   72     5   2
# 3    12     149 12.6   74     5   3
# 4    18     313 11.5   62     5   4
# 5    NA      NA 14.3   56     5   5
# 6    28      NA 14.9   66     5   6

可以看到,airquality 是寬數據的形式,接下來我們嘗試將其轉換為長數據。

dat_long <- melt(dat, id.vars = c("Month", "Day"), measure.vars = c("Ozone", "Solar.R"), na.rm = T,variable.name = "Vars", value.name = "Vals")
head(dat_long)
#   Month Day  Vars Vals
# 1     5   1 Ozone   41
# 2     5   2 Ozone   36
# 3     5   3 Ozone   12
# 4     5   4 Ozone   18
# 6     5   6 Ozone   28
# 7     5   7 Ozone   23

【注】代碼中設置了 na.rm = T 因此缺失值會直接被移除,如 5 月 5 日的 Ozone 沒有觀測值,5 月 6 日的 Solar.R 沒有觀測值,因此這里不會顯示 5 月 5 日的 Ozone。

以 Month 和 Day 構建二維的索引值,Ozone 和 Solar.R 作為 variable,兩個變量對應的數據作為 value 填入。但前六條記錄沒有顯示出 Solar.R 是為什么呢?因為 R 將 Ozone 的值存儲完畢以后才進行 Solar.R 的存儲,如下圖所示:

f91ae7dbc786ca3ef7114c10c7523057.png
從第 154 條數據開始記錄 Solar.R 的 value

【注】代碼的運行結果可以看到 5 月 6 日的 Solar.R 沒有觀測值,因此在長數據中會被移除,但 5 月 6 日的 Ozone 有觀測值,在長數據中沒有被移除,與寬數據格式中缺失值的移除有所差異(寬數據格式中,缺失值會被按行移除,意味著 5 月 6 日的所有數據都會被 remove)

下面我們試試將長數據轉換為寬數據:

dat_wide <- dcast(dat_long, Month + Day ~ Vars)
# 注意這里使用 Vars 而不是 Ozone 和 Solar.R
# 因為在 dat_long 中只有 Vars
head(dat_wide)
#   Month Day Ozone Solar.R
# 1     5   1    41     190
# 2     5   2    36     118
# 3     5   3    12     149
# 4     5   4    18     313
# 5     5   6    28      NA
# 6     5   7    23     299

這里沒有 5 月 5 日的數據是因為在將 dat 轉換為 dat_long 的過程中,分別刪除了 Ozone 和 Solar. R 的缺失值,而 5 月 5 日恰巧同時缺失這兩個數據,因此后續將 dat_long 轉換為 dat_wide 后,dat_wide 中就不存在 5 月 5 日的數據了。我們嘗試將 na.rm 設置為 F 看看結果有什么不同:

dat <- airquality
dat_long <- melt(dat, id = c("Month", "Day"), measure = c("Ozone", "Solar.R"))
head(dat_long)
#   Month Day variable value
# 1     5   1    Ozone    41
# 2     5   2    Ozone    36
# 3     5   3    Ozone    12
# 4     5   4    Ozone    18
# 5     5   5    Ozone    NA
# 6     5   6    Ozone    28dat_wide <- dcast(dat_long, Month + Day ~ variable)
head(dat_wide)
#   Month Day Ozone Solar.R
# 1     5   1    41     190
# 2     5   2    36     118
# 3     5   3    12     149
# 4     5   4    18     313
# 5     5   5    NA      NA
# 6     5   6    28      NA

如結果所示,5 月 5 日的數據會一直被保留下來。

再來看一個更復雜的例子:

set.seed(100)
grades <- data.frame(Month = rep(c(7,8), each = 5), Day = rep(seq(1, 31, by = 7), times = 2), Tom = sample(85:100, 10), Amy = sample(90:100, 10))
# 生成一個關于 Tom 和 Amy 在七、八月份的周測成績

成績單如下表所示:

64b4cc846444551f9cc76c6e7930a8ef.png

接著我們想要將其存儲在數據庫中,將其轉換為長數據:

grades_long <- melt(grades, id = c("Month", "Day"), measure = c("Tom", "Amy"))

結果如下表所示:

ef5f76a3aff20d90ac23510501897563.png

到了開家長會的時候,我們想要計算 Tom 和 Amy 的每月平均成績,可以通過如下代碼實現:

grades_wide <- dcast(grades_long, Month ~ variable, fun.aggregate = mean)
grades_wide
#   Month  Tom  Amy
# 1     7 91.0 95.8
# 2     8 96.2 94.4

由于每一個 Month 的值都對應 7 個 grades,因此我們使用 mean 求平均值,這樣通過 dcast() 中的 fun.aggregate 參數就可以非常便捷地獲得我們想要的數據啦~

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/529421.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/529421.shtml
英文地址,請注明出處:http://en.pswp.cn/news/529421.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

華為交換機s2700怎么重置_華為交換機忘記console的密碼,怎么恢復出廠設置

展開全部1、啟動時&#xff0c;32313133353236313431303231363533e58685e5aeb931333366303064按CtrlB進入BOOTROM目錄2、輸入BOOTROM的密碼盒式交換機的某些款型支持使用快捷鍵“CtrlE”進入BootROM主菜單&#xff0c;請根據設備的界面提示操作。盒式交換機在V100R006C03之前的…

啟動linux_使用 UEFI 雙啟動 Windows 和 Linux | Linux 中國

這是一份在同一臺機器上設置 Linux 和 Windows 雙重啟動的速成解釋&#xff0c;使用統一可擴展固件接口&#xff08;UEFI&#xff09;。來源&#xff1a;https://linux.cn/article-12891-1.html作者&#xff1a;Alan Formy-duval譯者&#xff1a;鄭&#xff08;本文字數&#x…

域控下發腳本_域用戶登陸腳本

如何為一個域用戶設置登陸腳本&#xff1f;- BAT可否作為登陸腳本&#xff1f;- 在域用戶“屬性”中&#xff0c;應如何指定登陸腳本名&#xff1f;"D:\x.bat"還是"\\srv\x.bat"&#xff1f;還是其它&#xff1f;- 腳本應該放在何處&#xff1f;- 還有沒有…

mysql增量腳本_mysql全量和增量備份腳本

全量&#xff1a;[rootmaster leo]# cat DBfullBak.sh#!/bin/bash#use mysqldump to fully backup mysql dataBakDir/root/leo/fullLogFile/root/leo/full/bak.logDatedate %Y%m%dBegindate "%Y年%m月%d日 %H:%M:%S"cd $BakDirDumpFile$Date.sqlGZDumpFile$Date.sql.…

mysql 事務 引擎_mysql引擎和事務

對于應用程序和用戶來說&#xff0c;同樣一張表的數據無論用什么引擎來存儲&#xff0c;看到的數據都是一樣的&#xff0c;只是不同的引擎在功能、占用空間大小、讀取性能等方面可能有所差別。mysql最常用的存儲引擎為Innodb、MyISAM和全文索引5.5.5以前默認存儲引擎為MyISAM&a…

shell mysql eof_shell EOF

1、考慮下面的需求&#xff0c;在主shell執行命令&#xff0c;進入其他的命令&#xff0c;后面的輸入&#xff0c;想作為命令的輸入&#xff0c;而不是主shell的輸入&#xff0c;怎么辦&#xff1f;2、使用<3、這里的EOF只是分界符&#xff0c;使用其他的字符也可以。4、比如…

MySQL查詢實驗報告_實驗報告數據庫的基本查詢'

《實驗報告數據庫的基本查詢》由會員分享&#xff0c;可在線閱讀&#xff0c;更多相關《實驗報告數據庫的基本查詢(5頁珍藏版)》請在人人文庫網上搜索。1、一、實驗目的&#xff1a;通過該實驗掌握應用SQL 查詢數據庫的基本方法&#xff0c;包括單表、多表查詢。二、實驗原理數…

mysql+odbc+ado_MFC ado+mysql+odbc技術分享

第一步&#xff1a;建立數據庫假設有一個sql文件mysql>use dbname; //創建一個數據庫名為dbname的數據庫(空數據庫)mysql>set names utf8; //編碼&#xff0c;mysql>source D:/dbname.sql; //導入一個數據庫源文件創建數據庫內容我做…

mysql 5.7 window x64_window環境配置Mysql 5.7.21 windowx64.zip免安裝版教程詳解

1.從官網下載mysql-5.7.21-windowx64.zip mysql下載頁面2.解壓到合適的位置(E:mysql) 這名字是我改過的3.配置環境變量&#xff0c;將E:mysqlbin 添加到PATH中4.在mysql目錄下(E:mysql) 創建 my.ini文件&#xff0c;內容如下&#xff1a;[mysql]# 設置mysql客戶端默認字符集def…

mysql設置查詢結果最大值_查找MySQL查詢結果字段的最大值

將它連接到僅有最大計數的第二個查詢。每天最內部查詢(對于給定用戶)每天計數的一組行數。從那以后&#xff0c;下一個外部執行從該集合中選擇MAX()來查找并獲得一個代表最高日數的記錄...因為它總是返回一行&#xff0c;并且加入到原始的numRequest表中它將是一個笛卡爾&#…

MySQL建表兩個單引號報錯_極客起源 - geekori.com - 問題詳情 - mysql建表報錯,查手冊看不懂,求解?...

創建帶索引的數據庫表需要為表名和屬性添加反單引號&#xff0c;并且你當前的primary key的位置需要調整一下&#xff1a;create table abc(id int unsigned auto_increment,usename char(20) not null default ,gender char(1) not null default ,weight tinyint unsigned not…

js 用下標獲取map值_javascript怎么獲取map的值?

Map對象保存鍵/值對&#xff0c;是鍵/值對的集合。任何值(對象或者原始值) 都可以作為一個鍵或一個值。Object結構提供了“字符串—值”的對應&#xff0c;Map結構提供了“值—值”的對應。JavaScript獲取map值示例&#xff1a;map對象如下&#xff1a;var mapObject {id1001:…

python attention機制_從零開始學Python自然語言處理(26)—— 強大的Attention機制...

前文傳送門&#xff1a;在上一次面試失利后&#xff0c;我回來仔細研究了一下Attention機制&#xff0c;研究完我不禁感悟&#xff0c;這機制真的厲害啊&#xff01;因為我之前面試被問到的Encoder - Decoder框架中有個瓶頸是編碼的結果以固定長度的中間向量表示&#xff0c;這…

[機器人-2]:開源MIT Min cheetah機械狗設計(二):機械結構設計

目錄 1、四肢朝向的選擇 2、電機布局形式的選擇 3、電機的選型及測試&#xff08;非常重要&#xff09; 4、結構優化 5、尺寸效應 6、其他 1、四肢朝向的選擇 機械狗的結構設計&#xff0c;第一個擺在我們面前的就說四肢的朝向問題&#xff0c;如下圖&#xff0c;我們是…

python傳文件給java_用java pyhont通過HTTP協議傳輸文件流

// 代碼網上抄的 忘記鏈接了 抱歉哈packageupload;importjava.io.BufferedReader;importjava.io.DataOutputStream;importjava.io.FileInputStream;importjava.io.IOException;importjava.io.InputStream;importjava.io.InputStreamReader;importjava.net.HttpURLConnection;im…

mysql挪到小數點位置_mysql數據庫遷移到另一個硬盤上

archliun系統mysql數據庫1、對新硬盤分區與格式化1)# fdisk /dev/sdb2) # mkfs.ext4 /dev/sdb12、停止MYSQL服務systemctl stop mysqld3、對數據庫文件拷貝# cp -Rp data /mnt/data/4、刪除原data文件# rm -rf /data5、禁止開機自啟MYSQL服務# systemctl disable mysqld6、對自…

mysql用戶權限表join_MyBatis映射利用mysql left join 解決N+1查詢問題

1.權限是幾乎每個系統都需要的2.一般在用戶請求某個url的時候&#xff0c;都需要驗證用戶是否擁有該url的訪問權限3.最簡單的權限系統需要 用戶表&#xff0c;角色表&#xff0c;用戶角色表&#xff0c;權限表&#xff0c;角色權限表# Host: 127.0.0.1 (Version: 5.6.22)# Date…

python 爬取貝殼網小區名稱_如何使用 python 爬取全國小區名稱

前言筆者在做一個 NLPNLPNLP 項目時&#xff0c;需要識別小區名&#xff0c;因此想要查詢網上是否有相關的數據集。經過一番搜索后一無所獲…從而決定自己來爬取這份數據。由于爬取網站的內容信息之后可能會發生變更&#xff0c;因此此處給出具體的爬蟲思路&#xff0c;便于應對…

mysql hint 簡書_MySQL

為滿足不同數據庫設計要求&#xff0c;減少數據冗余而指定設計規范&#xff0c;可稱為數據庫范式數據庫范式呈遞次規范&#xff0c;即高階范式必然滿足低階范式越高的數據庫范式意味著越嚴格的設計要求&#xff0c;同時數據冗余越小第一范式(1NF)&#xff1a;數據庫表的每一列都…

python獲取手機通知欄消息_Python編寫簡單的通知欄腳本啟動工具

隨著自己編寫的腳本與安裝的工具越來越多,電腦的桌面和文件夾也越來越亂了。就在前幾天因為一個不小心,我把自己的一個項目給刪了,所以決定將電腦整理一下。不過這一整理我很多腳本和工具的位置我就忘記了,所以決定寫個小工具來快速啟動一些常用的腳本或工具這里選擇Python是因…