R語言dataframe的常用操作總結

来源:https://www.cnblogs.com/huskysir/archive/2019/05/09/10841595.html
-Advertisement-
Play Games

前言:近段時間學習R語言用到最多的數據格式就是data.frame,現對data.frame常用操作進行總結,其中函數大部分來自dplyr包,該包由Hadley Wickham所作,主要用於數據的清洗和整理。 一、創建 data.frame創建較為容易,調用data.frame函數即可。本文創建一個 ...


前言:近段時間學習R語言用到最多的數據格式就是data.frame,現對data.frame常用操作進行總結,其中函數大部分來自dplyr包,該包由Hadley Wickham所作,主要用於數據的清洗和整理。

一、創建

data.frame創建較為容易,調用data.frame函數即可。本文創建一個關於學生成績的數據框,接下來大部分操作都對該數據框進行,其中學生成績隨機產生

 1 > library(dplyr)       #導入dplyr包
 2 > options(digits = 0)  #保留整數
 3 > set.seed(1)          #設置種子函數
 4 > df <- data.frame(ID = 1:12,                                 #ID
 5 +                  Class = rep(c(1,2,3),4),                   #班級
 6 +                  Chinese = runif(12,min = 0,max = 100),     #語文
 7 +                  Math = runif(12,min = 0,max = 100),        #數學
 8 +                  English = runif(12,min = 0,max = 100))     #英語
 9 > for (i in 1:ncol(df)) {
10 +   df[,i] <- as.integer(df[,i])  #將每列類型變為integer型
11 + }

df結果如下

 1 > df
 2    ID Class Chinese Math English
 3 1   1     1      26   68      26
 4 2   2     2      37   38      38
 5 3   3     3      57   76       1
 6 4   4     1      90   49      38
 7 5   5     2      20   71      86
 8 6   6     3      89   99      34
 9 7   7     1      94   38      48
10 8   8     2      66   77      59
11 9   9     3      62   93      49
12 10 10     1       6   21      18
13 11 11     2      20   65      82
14 12 12     3      17   12      66

二、 查詢

1、查詢某一行或某一列

可通過 data.frame[行號,] 或者 data.frame[,列號] 操作完成

其中 data.frame[行號,] 得到的類型是數據框

而 data.frame[,列號] 得到的類型是該列的類型

> df[2,]
  ID Class Chinese Math English
2 2 2 37 38 38 > df[,4] [1] 68 38 76 49 71 99 38 77 93 21 65 12

查詢某一列還可以通過 data.frame$列名 操作完成

> df$Chinese
 [1] 26 37 57 90 20 89 94 66 62  6 20 17

 data.frame[列號] 得到一個僅包含該列內容的數據框

 1 > df[3]
 2    Chinese
 3 1       26
 4 2       37
 5 3       57
 6 4       90
 7 5       20
 8 6       89
 9 7       94
10 8       66
11 9       62
12 10       6
13 11      20
14 12      17

若要查找符合條件的行,可採用 which() 函數,得到的類型是數據框

> df[which(df$ID == 4),]
  ID Class Chinese Math English
4  4     1      90   49      38

2、查詢某一個值

可通過 data.frame[行號,列號] 或 data.frame[行號,‘列名’] 操作完成

> df[3,4]
[1] 76
> df[3,'Math']
[1] 76

若查找符合條件的值,可採用 which() 函數

> df[which(df$Chinese == 57),'Math'] #查詢語文成績為57的同學的數學成績
[1] 76
> df[which(df$Class == 2),'English'] #查詢班級號為2的同學的英語成績
[1] 38 86 59 82

三、修改

1、修改某一行或列

> df[1,] <- c(1,2,65,59,73)  #修改第一行
#修改英語成績
> df[,'English'] <- c(23,45,67,87,34,46,87,95,43,76,23,94) 

修改後結果為(1號同學英語成績先由26修改為73,再修改為23)

 1 > df
 2    ID Class Chinese Math English
 3 1   1     2      65   59      23
 4 2   2     2      37   38      45
 5 3   3     3      57   76      67
 6 4   4     1      90   49      87
 7 5   5     2      20   71      34
 8 6   6     3      89   99      46
 9 7   7     1      94   38      87
10 8   8     2      66   77      95
11 9   9     3      62   93      43
12 10 10     1       6   21      76
13 11 11     2      20   65      23
14 12 12     3      17   12      94

2、修改某一個值

直接將需要修改後的值賦給上述查詢某一個值的操作即可

 1 > df[3,'Chinese'] <- 65 #將3號同學的語文成績修改為65
 2 #將語文成績低於20的同學的語文成績修改為20
 3 > df[which(df$Chinese < 20),'Chinese'] <- 20
 4 > df
 5        ID Class Chinese Math English
 6 1   1     2      65   59      23
 7 2   2     2      37   38      45
 8 3   3     3      65   76      67
 9 4   4     1      90   49      87
10 5   5     2      20   71      34
11 6   6     3      89   99      46
12 7   7     1      94   38      87
13 8   8     2      66   77      95
14 9   9     3      62   93      43
15 10 10     1      20   21      76
16 11 11     2      20   65      23
17 12 12     3      20   12      94

3、修改行列名

可用rownames()及colnames()得到數據框的行列名,rownames(data.frame)[行號] 或 colnames(data.frame)[列號] 可得到指定位置的行名或者列名,若修改直接賦值給該變數即可

1 > colnames(df)               #查詢列名
2 [1] "ID"      "Class"   "Chinese" "Math"    "English"
3 > colnames(df)[4]            #查詢第4列列名
4 [1] "Math"
5 > colnames(df)[4] <- "math"  #修改第4列列名為math
6 #修改列名
7 > colnames(df) <- c("ID","Class","Chinese","Math","English")

四、刪除

刪除行或列,僅需要選出該數據框的部分行或列,然後將其賦給該變數即可,其中在列號或行號前添加-表示不選該行或該列,在這裡,為了方便接下來的操作,我們將選出後的數據框賦給其他變數,要實現刪除操作應當將選出後的數據框賦給自己

 1 #選出df第1、3、5列  ( df <- df[,c(1,3,5)] )
 2 > df.tmp <- df[,c(1,3,5)]  
 3 > df.tmp
 4    ID Chinese English
 5 1   1      65      23
 6 2   2      37      45
 7 3   3      65      67
 8 4   4      90      87
 9 5   5      20      34
10 6   6      89      46
11 7   7      94      87
12 8   8      66      95
13 9   9      62      43
14 10 10      20      76
15 11 11      20      23
16 12 12      20      94
17 #刪除df第3行 ( df <- df[-3,] )
18 > df.tmp <- df[-3,]
19 > df.tmp
20    ID Class Chinese Math English
21 1   1     2      65   59      23
22 2   2     2      37   38      45
23 4   4     1      90   49      87
24 5   5     2      20   71      34
25 6   6     3      89   99      46
26 7   7     1      94   38      87
27 8   8     2      66   77      95
28 9   9     3      62   93      43
29 10 10     1      20   21      76
30 11 11     2      20   65      23
31 12 12     3      20   12      94

五、添加

1、添加行

data.frame[新行號,] <- 行值

 1 > df[13,] <- c(13,2,62,19,38) #新增13行數據
 2 > df
 3    ID Class Chinese Math English
 4 1   1     2      65   59      23
 5 2   2     2      37   38      45
 6 3   3     3      65   76      67
 7 4   4     1      90   49      87
 8 5   5     2      20   71      34
 9 6   6     3      89   99      46
10 7   7     1      94   38      87
11 8   8     2      66   77      95
12 9   9     3      62   93      43
13 10 10     1      20   21      76
14 11 11     2      20   65      23
15 12 12     3      20   12      94
16 13 13     2      62   19      38

若想對行進行複製,可以採用重覆行號的方法

 1 > df <- df[c(1,1:12),]      #複製第1行1次
 2 > df
 3     ID Class Chinese Math English
 4 1    1     2      65   59      23
 5 1.1  1     2      65   59      23
 6 2    2     2      37   38      45
 7 3    3     3      65   76      67
 8 4    4     1      90   49      87
 9 5    5     2      20   71      34
10 6    6     3      89   99      46
11 7    7     1      94   38      87
12 8    8     2      66   77      95
13 9    9     3      62   93      43
14 10  10     1      20   21      76
15 11  11     2      20   65      23
16 12  12     3      20   12      94

可使用rep()函數方便進行多行的複製

 1 > df <- df[rep(1:12,each = 2),]     #對每行數據複製1次
 2 > df
 3      ID Class Chinese Math English
 4 1     1     2      65   59      23
 5 1.1   1     2      65   59      23
 6 2     2     2      37   38      45
 7 2.1   2     2      37   38      45
 8 3     3     3      65   76      67
 9 3.1   3     3      65   76      67
10 4     4     1      90   49      87
11 4.1   4     1      90   49      87
12 5     5     2      20   71      34
13 5.1   5     2      20   71      34
14 6     6     3      89   99      46
15 6.1   6     3      89   99      46
16 7     7     1      94   38      87
17 7.1   7     1      94   38      87
18 8     8     2      66   77      95
19 8.1   8     2      66   77      95
20 9     9     3      62   93      43
21 9.1   9     3      62   93      43
22 10   10     1      20   21      76
23 10.1 10     1      20   21      76
24 11   11     2      20   65      23
25 11.1 11     2      20   65      23
26 12   12     3      20   12      94
27 12.1 12     3      20   12      94

還可採用rbind()函數,後續會有示例

2、添加列

data.frame$新列名 <- 列值

 1 > df$Physics <- c(23,34,67,23,56,67,78,23,54,56,67,34)
 2 > df
 3    ID Class Chinese Math English Physics
 4 1   1     2      65   59      23      23
 5 2   2     2      37   38      45      34
 6 3   3     3      65   76      67      67
 7 4   4     1      90   49      87      23
 8 5   5     2      20   71      34      56
 9 6   6     3      89   99      46      67
10 7   7     1      94   38      87      78
11 8   8     2      66   77      95      23
12 9   9     3      62   93      43      54
13 10 10     1      20   21      76      56
14 11 11     2      20   65      23      67
15 12 12     3      20   12      94      34

data.frame[,新列號] <- 列值

 1 > df[,7] <- c(1:12)
 2 > df
 3    ID Class Chinese Math English Physics V7
 4 1   1     2      65   59      23      23     1
 5 2   2     2      37   38      45      34     2
 6 3   3     3      65   76      67      67     3
 7 4   4     1      90   49      87      23     4
 8 5   5     2      20   71      34      56     5
 9 6   6     3      89   99      46      67     6
10 7   7     1      94   38      87      78     7
11 8   8     2      66   77      95      23     8
12 9   9     3      62   93      43      54     9
13 10 10     1      20   21      76      56    10
14 11 11     2      20   65      23      67    11
15 12 12     3      20   12      94      34    12

還可用dplyr包中的mutate()函數

 1 > mutate(df,Chemistry = Chinese + Math + English + Physics)
 2    ID Class Chinese Math English Physics V7 Chemistry
 3 1   1     2      65   59      23      23      1       170
 4 2   2     2      37   38      45      34      2       154
 5 3   3     3      65   76      67      67      3       275
 6 4   4     1      90   49      87      23      4       249
 7 5   5     2      20   71      34      56      5       181
 8 6   6     3      89   99      46      67      6       301
 9 7   7     1      94   38      87      78      7       297
10 8   8     2      66   77      95      23      8       261
11 9   9     3      62   93      43      54      9       252
12 10 10     1      20   21      76      56     10       173
13 11 11     2      20   65      23      67     11       175
14 12 12     3      20   12      94      34     12       160

還可採用cbind()函數,後續會有示例

六、dplyr包常用函數

 1 > df  #原數據
 2    ID Class Chinese Math English
 3 1   1     2      65   59      23
 4 2   2     2      37   38      45
 5 3   3     3      65   76      67
 6 4   4     1      90   49      87
 7 5   5     2      20   71      34
 8 6   6     3      89   99      46
 9 7   7     1      94   38      87
10 8   8     2      66   77      95
11 9   9     3      62   93      43
12 10 10     1      20   21      76
13 11 11     2      20   65      23
14 12 12     3      20   12      94

1、arrange() 排序

arrange(.data, ...)

arrange(.data, ..., .by_group = FALSE)

 1 > arrange(df,Chinese)  #按語文成績由小到大排序
 2    ID Class Chinese Math English
 3 1   5     2      20   71      34
 4 2  10     1      20   21      76
 5 3  11     2      20   65      23
 6 4  12     3      20   12      94
 7 5   2     2      37   38      45
 8 6   9     3      62   93      43
 9 7   1     2      65   59      23
10 8   3     3      65   76      67
11 9   8     2      66   77      95
12 10  6     3      89   99      46
13 11  4     1      90   49      87
14 12  7     1      94   38      87

函數中第一個是待排序的數據框,之後依次是變數,且變數優先順序逐漸降低,如語文、數學成績進行排序

 1 > arrange(df,Chinese,Math)  #依次按語文、數學成績由小到大排序
 2    ID Class Chinese Math English
 3 1  12     3      20   12      94
 4 2  10     1      20   21      76
 5 3  11     2      20   65      23
 6 4   5     2      20   71      34
 7 5   2     2      37   38      45
 8 6   9     3      62   93      43
 9 7   1     2      65   59      23
10 8   3     3      65   76      67
11 9   8     2      66   77      95
12 10  6     3      89   99      46
13 11  4     1      90   49      87
14 12  7     1      94   38      87

若想由大到小排序,使用desc()函數

 1 > arrange(df,desc(Chinese))  #按語文成績由大到小排序
 2    ID Class Chinese Math English
 3 1   7     1      94   38      87
 4 2   4     1      90   49      87
 5 3   6     3      89   99      46
 6 4   8     2      66   77      95
 7 5   1     2      65   59      23
 8 6   3     3      65   76      67
 9 7   9     3      62   93      43
10 8   2     2      37   38      45
11 9   5     2      20   71      34
12 10 10     1      20   21      76
13 11 11     2      20   65      23
14 12 12     3      20   12      94

2、distinct()函數 去重

distinct(.data, ..., .keep_all = FALSE)

 1 > df1 <- df[rep(1:nrow(df),each = 2),] #將df每行複製1次
 2 > df1
 3      ID Class Chinese Math English
 4 1     1     2      65   59      23
 5 1.1   1     2      65   59      23
 6 2     2     2      37   38      45
 7 2.1   2     2      37   38      45
 8 3     3     3      65   76      67
 9 3.1   3     3      65   76      67
10 4     4     1      90   49      87
11 4.1   4     1      90   49      87
12 5     5     2      20   71      34
13 5.1   5     2      20   71      34
14 6     6     3      89   99      46
15 6.1   6     3      89   99      46
16 7     7     1      94   38      87
17 7.1   7     1      94   38      87
18 8     8     2      66   77      95
19 8.1   8     2      66   77      95
20 9     9     3      62   93      43
21 9.1   9     3      62   93      43
22 10   10     1      20   21      76
23 10.1 10     1      20   21      76
24 11   11     2      20   65      23
25 11.1 11     2      20   65      23
26 12   12     3      20   12      94
27 12.1 12     3      20   12      94
28 > df1 <- distinct(df1)  #去除重覆的行
29 > df1
30    ID Class Chinese Math English
31 1   1     2      65   59      23
32 2   2     2      37   38      45
33 3   3     3      65   76      67
34 4   4     1      90   49      87
35 5   5     2      20   71      34
36 6   6     3      89   99      46
37 7   7     1      94   38      87
38 8   8     2      66   77      95
39 9   9     3      62   93      43
40 10 10     1      20   21      76
41 11 11     2      20   65      23
42 12 12     3      20   12      94

3、group_by()函數 分組     summarise()函數 概括

group_by(.data, ..., add = FALSE, .drop = FALSE)

ungroup(x, ...)

summarise(.data, ...)

group_by()與summarise()函數常連用,用於對不同的分組進行操作,在這裡再介紹一個管道函數“%>%”,其作用是把左件的值發送給右件的表達式,並作為右件表達式函數的第一個參數

1 > df %>%
2 +   group_by(Class) %>%
3 +   summarise(max = max(Chinese)) #求出按Class分組每組中語文成績最高分
4 # A tibble: 3 x 2
5   Class   max
6   <dbl> <dbl>
7 1     1    94
8 2     2    66
9 3     3    89

4、filter()函數 篩選

filter(.data, ..., .preserve = FALSE)

選出符合條件的行(返回數據框格式)

 1 > df %>%
 2 +   group_by(Class) %>%
 3 +   filter(Chinese == max(Chinese))  #選出每個班語文成績最高的學生的信息
 4 # A tibble: 3 x 5
 5 # Groups:   Class [3]
 6      ID Class Chinese  Math English
 7   <dbl> <dbl>   <dbl> <dbl>   <dbl>
 8 1     6     3      89    99      46
 9 2     7     1      94    38      87
10 3     8     2      66    77      95

5、select()函數 選擇

select(.data, ...)

 1 > select(df,ID,Chinese,Math,English) #選出df中ID、語文、數學、英語數據
 2    ID Chinese Math English
 3 1   1      65   59      23
 4 2   2      37   38      45
 5 3   3      65   76      67
 6 4   4      90   49      87
 7 5   5      20   71      34
 8 6   6      89   99      46
 9 7   7      94   38      87
10 8   8      66   77      95
11 9   9      62   93      43
12 10 10      20   21      76
13 11 11      20   65      23
14 12 12      20   12      94

6、rbind()函數與cbind()函數 合併

rbind()函數根據行進行合併,cbind()根據列進行合併

 1 #新建數據框df1
 2 > df1 <- data.frame(ID = 13,Class = 2,
 3 Chinese = 65,Math = 26,English = 84)
 4 > df1
 5   ID Class Chinese Math English
 6 1 13     2      65   26      84
 7 > rbind(df,df1)  #合併df與df1
 8    ID Class Chinese Math English
 9 1   1     2      65   59      23
10 2   2     2      37   38      45
11 3   3     3      65   76      67
12 4   4     1      90   49      87
13 5   5     2      20   71      34
14 6   6     3      89   99      46
15 7   7     1      94   38      87
16 8   8     2      66   77      95
17 9   9     3      62   93      43
18 10 10     1      20   21      76
19 11 11     2      20   65      23
20 12 12     3      20   12      94
21 13 13     2      65   26      84
22 > df2 #新建數據框df2
23    Biological
24 1          65
25 2          15
26 3          35
27 4          59
28 5          64
29 6          34
30 7          29
31 8          46
32 9          32
33 10         95
34 11         46
35 12         23
36 > cbind(df,df2)  #合併df與df2
37    ID Class Chinese Math English Biological
38 1   1     2      65   59      23         65
39 2   2     2      37   38      45         15
40 3   3     3      65   76      67         35
41 4   4     1      90   49      87         59
42 5   5     2      20   71      34         64
43 6   6     3      89   99      46         34
44 7   7     1      94   38      87         29
45 8   8     2      66   77      95         46
46 9   9     3      62   93      43         32
47 10 10     1      20   21      76         95
48 11 11     2      20   65      23         46
49 12 12     3      20   12      94         23

7、join函數 連接

inner_join(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"),...)

left_join(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...)

right_join(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"),...)

full_join(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...)

semi_join(x, y, by = NULL, copy = FALSE, ...)

nest_join(x, y, by = NULL, copy = FALSE, keep = FALSE, name = NULL,...)

anti_join(x, y, by = NULL, copy = FALSE, ...)

join函數類型比較多,這裡僅以left_join()函數舉例

 1 #新建數據框Class
 2 > Class <- data.frame(Class = c(1,2,3),class = c('一班','二班','三班'))
 3 > Class
 4   Class class
 5 1     1  一班
 6 2     2  二班
 7 3     3  三班
 8 > left_join(df,Class,by = 'Class') #基於Class變數左連接df與Class數據框
 9    ID Class Chinese Math English class
10 1   1     2      65   59      23    二班
11 2   2     2      37   38      45    二班
12 3   3     3      65   76      67    三班
13 4   4     1      90   49      87    一班
14 5   5     2      20   71      34    二班
15 6   6     3      89   99      46    三班
16 7   7     1      94   38      87    一班
17 8   8     2      66   77      95    二班
18 9   9     3      62   93      43    三班
19 10 10     1      20   21      76    一班
20 11 11     2      20   65      23    二班
21 12 12     3      20   12      94    三班

left_join()函數僅保留df對應的Class值的數據

以上是關於data.frame數據框的一點學習總結,如有錯誤,敬請諒解。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 提出問題 「領域驅動設計」之於微服務,好比麥當勞之於漢堡(個人更喜歡肯德基,漢堡要大些,麥當勞的漢堡,想吃頓飽飯,請先給我上6個😂)。但是TDD測試驅動、MDD模型驅動好像也很火啊,到底什麼在驅動? 分析問題 不用著急,這是三個5分鐘就能區分開的概念。開發中在協同工作。 首先糾正兩個誤區。DDD是 ...
  • 一.SpringAOP的概述。 AOP(Aspect Oriented Programming),面向切麵編程,通過預編譯方式和運行期間動態代理實現程式的功能的統一維護的技術。AOP是OOP(面向對象編程)的擴展和延伸。舉個例子,讓大家對AOP印象更加深刻點。 比如許可權校驗。實際開發中,我們知道不是 ...
  • 一、JDK的安裝 1、打開下載好的安裝包(我在這裡附上一個百度雲連接,https://pan.baidu.com/s/1o3nx0kbmecAISeneGqykLQ 提取碼:jnw6) 傻瓜式安裝,直接點下一步就行。 2、安裝路徑 安裝路徑隨意,只要不是中文路徑就Ok!!!我比較懶,直接使用的預設安 ...
  • 參考自:https://blog.csdn.net/dreaming__ldx/article/details/84976834 https://blog.csdn.net/acterminate/article/details/79339494 題意: 給你一個數組,將數組裡的所有元素進行全排列, ...
  • 線程的理解應該結合進程來對比理解更直接 如果我們操作系統當做一個工廠的話,那麼創建一個進程就相當於在這個工廠裡面新增了一個車間,車間裡面存放了很多資源,而車間要運行起來很顯然的標誌就是流水線,而這些流水線就是線程,可以說線程是執行代碼的最小單位。 而線程和進程兩者在使用層面上有很大的相似性,所以開啟 ...
  • Python是一種廣泛使用的解釋型、高級編程、通用型編程語言,由吉多·範羅蘇姆創造,第一版發佈於1991年。可以視之為一種改良(加入一些其他編程語言的優點,如面向對象)的LISP。Python的設計哲學強調代碼的可讀性和簡潔的語法(尤其是使用空格縮進劃分代碼塊,而非使用大括弧或者關鍵詞)。相比於C+ ...
  • dubbo集群概述 dubbo集群功能的切入點在ReferenceConfig.createProxy方法以及Protocol.refer方法中。 在ReferenceConfig.createProxy方法中,如果用戶指定多個提供者url或註冊中心url,那麼會創建多個Invoker,然後用Sta ...
  • ###15Collection-List-ArrayList/LinkedList/* * Collection介面中的方法* A:添加功能* boolean add(Object obj):把obj這個元素,添加到集合中去* boolean addAll(Collection c):將 c 這個集 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...