亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何連接(合并)數據框(內部,外部,左側,右側)

如何連接(合并)數據框(內部,外部,左側,右側)

12345678_0001 2019-05-20 16:25:26
給出兩個數據框:df1 = data.frame(CustomerId = c(1:6), Product = c(rep("Toaster", 3), rep("Radio", 3)))df2 = data.frame(CustomerId = c(2, 4, 6), State = c(rep("Alabama", 2), rep("Ohio", 1)))df1#  CustomerId Product#           1 Toaster#           2 Toaster#           3 Toaster#           4   Radio#           5   Radio#           6   Radiodf2#  CustomerId   State#           2 Alabama#           4 Alabama#           6    Ohio我怎樣才能做數據庫風格,即sql風格,加入?也就是說,我該怎么做:一個內連接的df1和df2:只返回行中左表在右表匹配的密鑰。一個外連接的df1和df2:返回兩個表中的所有行,從有右表中的匹配鍵左連接記錄。甲左外連接(或簡稱為左加入)的df1和df2左表中返回所有行,并與匹配的右表鍵任何行。一個右外連接的df1,并df2返回右表中的所有行,任何行與左表中匹配的密鑰。額外信用:如何進行SQL樣式選擇語句?
查看完整描述

4 回答

?
Helenr

TA貢獻1780條經驗 獲得超4個贊


內連接有data.table方法,這非常節省時間和內存(對于一些較大的data.frames是必需的):


library(data.table)


dt1 <- data.table(df1, key = "CustomerId") 

dt2 <- data.table(df2, key = "CustomerId")


joined.dt1.dt.2 <- dt1[dt2]

merge也適用于data.tables(因為它是通用的和調用merge.data.table)


merge(dt1, dt2)

stackoverflow上記錄的data.table:

如何進行data.table合并操作
將外鍵上的SQL連接轉換為R data.table語法
為更大的data.frames合并的有效替代方案R 
如何使用data.table進行基本的左外連接在R?

另一種選擇是joinplyr包中找到的功能

library(plyr)


join(df1, df2,

     type = "inner")


#   CustomerId Product   State

# 1          2 Toaster Alabama

# 2          4   Radio Alabama

# 3          6   Radio    Ohio

為選項type:inner,left,right,full。


From ?join:與merge[ join] 不同,[ ]無論使用何種連接類型,都會保留x的順序。


查看完整回答
反對 回復 2019-05-20
?
鴻蒙傳說

TA貢獻1865條經驗 獲得超7個贊

你也可以使用Hadley Wickham令人敬畏的dplyr軟件包進行連接。


library(dplyr)


#make sure that CustomerId cols are both type numeric

#they ARE not using the provided code in question and dplyr will complain

df1$CustomerId <- as.numeric(df1$CustomerId)

df2$CustomerId <- as.numeric(df2$CustomerId)

變異連接:使用df2中的匹配將列添加到df1

#inner

inner_join(df1, df2)


#left outer

left_join(df1, df2)


#right outer

right_join(df1, df2)


#alternate right outer

left_join(df2, df1)


#full join

full_join(df1, df2)

過濾聯接:過濾掉df1中的行,不要修改列

semi_join(df1, df2) #keep only observations in df1 that match in df2.

anti_join(df1, df2) #drops all observations in df1 that match in df2.


查看完整回答
反對 回復 2019-05-20
  • 4 回答
  • 0 關注
  • 1062 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號