R語言數(shù)據(jù)結(jié)構(gòu)(三)數(shù)據(jù)框

數(shù)據(jù)結(jié)構(gòu)是指在計(jì)算機(jī)中存儲(chǔ)和組織數(shù)據(jù)的方式璧帝,不同的數(shù)據(jù)結(jié)構(gòu)有不同的特點(diǎn)和適用場(chǎng)景。R語言中的常用數(shù)據(jù)結(jié)構(gòu)圾旨,包括向量碌识、矩陣、數(shù)組舰绘、列表和數(shù)據(jù)框蹂喻。關(guān)于數(shù)據(jù)結(jié)構(gòu)的使用葱椭,我們將分四篇文章分別介紹每種數(shù)據(jù)結(jié)構(gòu)的操作方法和代碼示例。

為方便大家理解記憶口四,對(duì)每種數(shù)據(jù)結(jié)構(gòu)的基本操作概括為四大類:

  1. 創(chuàng)建數(shù)據(jù)結(jié)構(gòu)
  2. 往里面添加數(shù)據(jù)
  3. 從里面查詢數(shù)據(jù)
  4. 對(duì)里面的數(shù)據(jù)進(jìn)行修改

這篇文章我們將介紹數(shù)據(jù)框的使用

數(shù)據(jù)框

數(shù)據(jù)框是R語言中的一種類似于表格的數(shù)據(jù)結(jié)構(gòu)孵运,它是由一系列相同長(zhǎng)度的向量組成的有序集合。數(shù)據(jù)框有兩個(gè)維度蔓彩,分別表示行數(shù)和列數(shù)治笨,可以用dim()函數(shù)來獲取。數(shù)據(jù)框中的每個(gè)向量可以有一個(gè)名稱赤嚼,可以用names()函數(shù)來獲取或設(shè)置旷赖。數(shù)據(jù)框中的每個(gè)向量可以是不同的類型,但同一列的元素必須是相同的類型探膊。

創(chuàng)建數(shù)據(jù)框

創(chuàng)建數(shù)據(jù)框的一種常用方法是使用data.frame()函數(shù)杠愧,它可以將多個(gè)向量組合成一個(gè)數(shù)據(jù)框。data.frame()函數(shù)的參數(shù)有:

  • ...: 這些參數(shù)可以采用valuetag = value的形式逞壁。組件名稱將基于tag(如果存在)或被解析的參數(shù)本身流济。
  • row.names: 可以是NULL、單個(gè)整數(shù)或字符字符串腌闯,用于指定用作行名的列绳瘟,或者是字符或整數(shù)向量,提供數(shù)據(jù)框的行名姿骏。
  • check.rows: 若為TRUE糖声,則會(huì)檢查行的長(zhǎng)度和名稱是否一致。
  • check.names: 邏輯值分瘦。若為TRUE蘸泻,則會(huì)檢查數(shù)據(jù)框中變量的名稱,以確保它們是符合語法規(guī)范的變量名稱且不重復(fù)嘲玫。必要時(shí)悦施,會(huì)進(jìn)行調(diào)整(通過make.names函數(shù))。
  • fix.empty.names: 邏輯值去团,指示是否為“未命名”的參數(shù)(指的是未被正式命名為someName = arg的參數(shù))自動(dòng)生成一個(gè)名稱抡诞,還是使用名稱""。即使check.names為FALSE土陪,如果要保留""作為名稱昼汗,也需要將此參數(shù)設(shè)置為FALSE。
  • stringsAsFactors: 邏輯值鬼雀,指定是否將字符向量轉(zhuǎn)換為因子向量顷窒。在R 4.0.0之前,默認(rèn)設(shè)置是TRUE源哩,但現(xiàn)在已更改為FALSE蹋肮。

例如:


df1 <- data.frame(name = c("Alice", "Bob", "Charlie"), 
                  age = c(20, 25, 30), 
                  gender = c("F", "M", "M"))
df1
#      name age gender
# 1   Alice  20      F
# 2     Bob  25      M
# 3 Charlie  30      M

# 使用兩個(gè)向量創(chuàng)建一個(gè)數(shù)據(jù)框出刷,并給每行命名
df2 <- data.frame(score = c(90, 80, 70), 
                  grade = c("A", "B", "C"), 
                  row.names = c("Math", "English", "History"))
df2
#         score grade
# Math       90     A
# English    80     B
# History    70     C

# 使用兩個(gè)向量創(chuàng)建一個(gè)數(shù)據(jù)框,并不將字符向量轉(zhuǎn)換為因子向量
df3 <- data.frame(color = c("red", "green", "blue"), 
                  code = c("#FF0000", "#00FF00", "#0000FF"), 
                  stringsAsFactors = FALSE)
df3
#   color    code
# 1   red #FF0000
# 2 green #00FF00
# 3  blue #0000FF

數(shù)據(jù)框有兩個(gè)維度坯辩,即行和列,可以用dim()函數(shù)獲取崩侠。而數(shù)據(jù)框的行名和列名分別對(duì)應(yīng)著數(shù)據(jù)框的行和列的標(biāo)識(shí)符漆魔,可以用row.names()和colnames()函數(shù)來獲取和設(shè)置。

  • 行名:數(shù)據(jù)框的每一行都有一個(gè)行名却音,用于標(biāo)識(shí)不同的行改抡。行名是一個(gè)字符向量,可以通過row.names()函數(shù)獲取或設(shè)置系瓢。
  • 列名:數(shù)據(jù)框的每一列都有一個(gè)列名阿纤,用于標(biāo)識(shí)不同的列。列名是一個(gè)字符向量夷陋,可以通過colnames()函數(shù)獲取或設(shè)置欠拾。

下面是一些關(guān)于數(shù)據(jù)框行名和列名的示例代碼:

# 創(chuàng)建示例數(shù)據(jù)框
df <- data.frame(
  name = c("Alice", "Bob", "Charlie"),
  age = c(20, 25, 30),
  gender = c("F", "M", "M")
)

df
#      name age gender
# 1   Alice  20      F
# 2     Bob  25      M
# 3 Charlie  30      M

# 獲取數(shù)據(jù)框的行名和列名
row_names <- row.names(df)
col_names <- colnames(df)

cat("數(shù)據(jù)框的行名:\n")
row_names
# 輸出:
# 數(shù)據(jù)框的行名:
# [1] "1" "2" "3"

cat("數(shù)據(jù)框的列名:\n")
col_names

# 數(shù)據(jù)框的列名:
# [1] "name"   "age"    "gender"

# 修改數(shù)據(jù)框的行名和列名
# 設(shè)置新的行名和列名
new_row_names <- c("row1", "row2", "row3")
new_col_names <- c("姓名", "年齡", "性別")

# 使用row.names()和colnames()函數(shù)設(shè)置新的行名和列名
row.names(df) <- new_row_names
colnames(df) <- new_col_names

cat("修改后的數(shù)據(jù)框:\n")
df
# 輸出:
# 修改后的數(shù)據(jù)框:
#       姓名 年齡 性別
# row1 Alice  20   F
# row2   Bob  25   M
# row3 Charlie  30   M

訪問數(shù)據(jù)框

訪問數(shù)據(jù)框中的元素可以使用方括號(hào)[]和行列索引號(hào)或名稱。行列索引號(hào)從1開始骗绕,表示第一行或第一列藐窄,負(fù)數(shù)表示排除對(duì)應(yīng)位置的元素。名稱是指數(shù)據(jù)框中每個(gè)向量的名稱酬土,可以用雙引號(hào)或單引號(hào)包圍荆忍。使用方括號(hào)[]訪問數(shù)據(jù)框中的元素時(shí),返回的結(jié)果仍然是一個(gè)數(shù)據(jù)框撤缴。例如:


# 訪問df1數(shù)據(jù)框中的第一行
df1[1, ]
#    name age gender
# 1 Alice  20      F

# 訪問df2數(shù)據(jù)框中的"score"列
df2["score"]
#         score
# Math       90
# English    80
# History    70

如果想要訪問數(shù)據(jù)框中的元素的值刹枉,而不是一個(gè)數(shù)據(jù)框,可以使用雙方括號(hào)[[]]或者美元符號(hào)$屈呕。例如:


# 訪問df1數(shù)據(jù)框中的第一行的值
df1[[1]]
#  [1] "Alice" "Bob"   "Charlie"


# 訪問df2數(shù)據(jù)框中的"score"列的值
df2$score
# [1] 90 80 70

如果數(shù)據(jù)框中的元素是一個(gè)向量微宝,可以在雙方括號(hào)[[]]或者美元符號(hào)$后面加上方括號(hào)[]和相應(yīng)的索引號(hào)來訪問子元素。例如:


# 訪問df1數(shù)據(jù)框中的第一列(一個(gè)向量)的第二個(gè)子元素
df1[[1]][2]
# [1] "Bob"

# 訪問df2數(shù)據(jù)框中的"grade"列(一個(gè)向量)的第三個(gè)子元素
df2$grade[3]
# [1] C

修改數(shù)據(jù)框

修改數(shù)據(jù)框中的元素可以使用賦值符號(hào)<-或者等號(hào)=凉袱。例如:


# 修改df1數(shù)據(jù)框中的第二行為c("David", 28, "M")
df1[2, ] <- c("David", 28, "M")
df1
#      name age gender
# 1   Alice  20      F
# 2   David  28      M
# 3 Charlie  30      M

# 修改df2數(shù)據(jù)框中的"grade"列為c("A+", "B+", "C+")
df2["grade"] <- c("A+", "B+", "C+")
df2
#         score grade
# Math       90    A+
# English    80    B+
# History    70    C+

# 修改df3數(shù)據(jù)框中的第一行第二列的元素為"#FFFFFF"
df3[1, 2] <- "#FFFFFF"
df3
#   color    code
# 1   red #FFFFFF
# 2 green #00FF00

為數(shù)據(jù)框增加一列


# 假設(shè)有一個(gè)數(shù)據(jù)框df_add
df_add <- data.frame(name = c("Alice", "Bob", "Charlie"),
                 age = c(20, 25, 30),
                 gender = c("F", "M", "M"))
df_add
#      name age gender
# 1   Alice  20      F
# 2     Bob  25      M
# 3 Charlie  30      M

# 要增加一列"city"芥吟,包含每個(gè)人對(duì)應(yīng)的城市信息
city <- c("New York", "London", "Tokyo")

# 使用賦值符號(hào)<-給數(shù)據(jù)框增加新列
df_add$city <- city

# 查看增加列后的數(shù)據(jù)框
df_add
#      name age gender     city
# 1   Alice  20      F New York
# 2     Bob  25      M   London
# 3 Charlie  30      M    Tokyo

合并數(shù)據(jù)框

我們可以用rbind()cbind()函數(shù)來按行或列合并數(shù)據(jù)框,參數(shù)是兩個(gè)或多個(gè)數(shù)據(jù)框专甩,它們必須有相同的列數(shù)或行數(shù)钟鸵。例如:

# 創(chuàng)建兩個(gè)數(shù)據(jù)框
d1 <- data.frame(name = c("Alice", "Bob"), age = c(20, 21))
d1
#    name age
# 1 Alice  20
# 2   Bob  21

d2 <- data.frame(name = c("Charlie", "David"), age = c(22, 23))
d2
#      name age
# 1 Charlie  22
# 2   David  23

# 按行合并兩個(gè)數(shù)據(jù)框
d3 <- rbind(d1, d2)
# 查看合并后的數(shù)據(jù)框內(nèi)容
d3
#      name age
# 1   Alice  20
# 2     Bob  21
# 3 Charlie  22
# 4   David  23

# 創(chuàng)建兩個(gè)數(shù)據(jù)框
d4 <- data.frame(name = c("Alice", "Bob"), gender = c(TRUE, FALSE))
d4
#    name gender
# 1 Alice   TRUE
# 2   Bob  FALSE

d5 <- data.frame(age = c(20, 21), city = c("New York", "London"))
d5
#   age     city
# 1  20 New York
# 2  21   London

# 按列合并兩個(gè)數(shù)據(jù)框
d6 <- cbind(d4, d5)
# 查看合并后的數(shù)據(jù)框內(nèi)容
d6
# 輸出結(jié)果
#    name gender age    city
# 1 Alice   TRUE  20 New York
# 2   Bob  FALSE  21   London

刪除數(shù)據(jù)框

下面示例代碼展示了如何使用負(fù)數(shù)索引和subset()函數(shù)在R語言中刪除數(shù)據(jù)框中的行或列,并在每個(gè)操作后注釋了相應(yīng)的輸出結(jié)果涤躲。請(qǐng)注意棺耍,這些操作都會(huì)生成新的數(shù)據(jù)框,并不會(huì)對(duì)原始數(shù)據(jù)框進(jìn)行修改种樱。


# 創(chuàng)建示例數(shù)據(jù)框
df <- data.frame(
  name = c("Alice", "Bob", "Charlie", "David"),
  age = c(20, 25, 30, 28),
  gender = c("F", "M", "M", "M")
)

# 輸出原始數(shù)據(jù)框
cat("原始數(shù)據(jù)框:\n")
print(df)

# 原始數(shù)據(jù)框:
#      name age gender
# 1   Alice  20      F
# 2     Bob  25      M
# 3 Charlie  30      M
# 4   David  28      M

# 刪除行
# 刪除數(shù)據(jù)框中的第一行
df_deleted_row <- df[-1, ]
cat("刪除第一行后的數(shù)據(jù)框:\n")
print(df_deleted_row)

# 刪除第一行后的數(shù)據(jù)框:
#      name age gender
# 2     Bob  25      M
# 3 Charlie  30      M
# 4   David  28      M

# 使用subset函數(shù)根據(jù)條件刪除行(刪除年齡為25歲的行)
df_deleted_age <- subset(df, age != 25)
cat("根據(jù)條件刪除age為25歲的行后的數(shù)據(jù)框:\n")
print(df_deleted_age)

# 根據(jù)條件刪除age為25歲的行后的數(shù)據(jù)框:
#      name age gender
# 1   Alice  20      F
# 3 Charlie  30      M
# 4   David  28      M

# 刪除列
# 刪除數(shù)據(jù)框中的gender列
df_deleted_column <- df[, -3]
cat("刪除gender列后的數(shù)據(jù)框:\n")
print(df_deleted_column)

# 刪除gender列后的數(shù)據(jù)框:
#      name age
# 1   Alice  20
# 2     Bob  25
# 3 Charlie  30
# 4   David  28

# 使用subset函數(shù)根據(jù)條件刪除列(刪除age列)
df_deleted_age_column <- subset(df, select = -c(age))
cat("根據(jù)條件刪除age列后的數(shù)據(jù)框:\n")
print(df_deleted_age_column)

# 根據(jù)條件刪除age列后的數(shù)據(jù)框:
#      name gender
# 1   Alice      F
# 2     Bob      M
# 3 Charlie      M
# 4   David      M
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蒙袍,一起剝皮案震驚了整個(gè)濱河市俊卤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌害幅,老刑警劉巖消恍,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異以现,居然都是意外死亡狠怨,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門邑遏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來佣赖,“玉大人,你說我怎么就攤上這事记盒≡鞲颍” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵纪吮,是天一觀的道長(zhǎng)俩檬。 經(jīng)常有香客問我,道長(zhǎng)彬碱,這世上最難降的妖魔是什么豆胸? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮巷疼,結(jié)果婚禮上晚胡,老公的妹妹穿的比我還像新娘。我一直安慰自己嚼沿,他們只是感情好估盘,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著骡尽,像睡著了一般遣妥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上攀细,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天箫踩,我揣著相機(jī)與錄音,去河邊找鬼谭贪。 笑死境钟,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的俭识。 我是一名探鬼主播慨削,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了缚态?” 一聲冷哼從身側(cè)響起磁椒,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎玫芦,沒想到半個(gè)月后浆熔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡桥帆,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年蘸拔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片环葵。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖宝冕,靈堂內(nèi)的尸體忽然破棺而出张遭,到底是詐尸還是另有隱情,我是刑警寧澤地梨,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布菊卷,位于F島的核電站,受9級(jí)特大地震影響宝剖,放射性物質(zhì)發(fā)生泄漏洁闰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一万细、第九天 我趴在偏房一處隱蔽的房頂上張望扑眉。 院中可真熱鬧,春花似錦赖钞、人聲如沸腰素。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽弓千。三九已至,卻和暖如春献起,著一層夾襖步出監(jiān)牢的瞬間洋访,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工谴餐, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留姻政,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓总寒,卻偏偏與公主長(zhǎng)得像扶歪,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容