English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

التشكيل البياني في R

合并数据框

R 语言合并数据框使用 merge() 函数。

merge() 函数语法格式如下:

# S3 方法
merge(x, y, …)
# data.frame 的 S3 方法 
merge(x, y, by = intersect(names(x), names(y)),
      by.x = by, by.y = by, all = FALSE, all.x = all, all.y = all,
      sort = TRUE, suffixes = c(".x",".y"), no.dups = TRUE,
      incomparables = NULL, …)

شرح المعلمات الشائعة:

  • x, y: جداول بيانات

  • by, by.x, by.y: تحديد اسم عمود التطابق في الجداول الاثنين، افتراضياً يتم استخدام نفس اسم العمود في الجداول الاثنين.

  • all: قيمة منطقية; all = L هو اختصار لـ all.x = L و all.y = L، حيث يمكن أن يكون L TRUE أو FALSE.

  • all.x: قيمة منطقية، افتراضياً FALSE. إذا كان TRUE، يتم عرض الصفوف التي تطابقها في x، حتى لو لم يكن هناك تطابق في y، ويتم تمثيل الصفوف التي لا تتطابق في y بـ NA.

  • all.y: قيمة منطقية، افتراضياً FALSE. إذا كان TRUE، يتم عرض الصفوف التي تطابقها في y، حتى لو لم يكن هناك تطابق في x، ويتم تمثيل الصفوف التي لا تتطابق في x بـ NA.

  • sort: قيمة منطقية، ما إذا كان يجب ترتيب الأعمدة أم لا.

函数 merge() مشابهة جداً لميزة JOIN في SQL:

  • Natural join أو INNER JOIN:إذا كان هناك تطابق على الأقل في الجدول، فإنه يعود بالصفوف

  • Left outer join أو LEFT JOIN:حتى لو لم يكن هناك تطابق في الجدول الأيمن، فإنه يعود بجميع الصفوف من الجدول الأيسر

  • Right outer join أو RIGHT JOIN:حتى لو لم يكن هناك تطابق في الجدول الأيسر، فإنه يعود بجميع الصفوف من الجدول الأيمن

  • Full outer join أو FULL JOIN:只要其中一个表中存在匹配,则返回行

# data frame 1
df1 = data.frame(SiteId = c(1:6), Site = c("Google","w3codebox","Taobao","Facebook","Zhihu","Weibo"))
# data frame 2
df2 = data.frame(SiteId = c(2, 4, 6, 7, 8), Country = c("CN","USA","CN","USA","IN")) 
# INNER JOIN 
df1 = merge(x=df1, y=df2, by="SiteId")
print("----- INNER JOIN -----")
print(df1)
# FULL JOIN
df2 = merge(x=df1,y=df2,by="SiteId",all=TRUE)
print("----- FULL JOIN -----")
print(df2)
# LEFT JOIN
df3 = merge(x=df1,y=df2,by="SiteId",all.x=TRUE)
print("----- LEFT JOIN -----")
print(df3)
# RIGHT JOIN
df4 = merge(x=df1,y=df2,by="SiteId",all.y=TRUE)
print("----- RIGHT JOIN -----")
print(df4)

نتيجة تنفيذ الكود أعلاه

[1] "----- INNER JOIN -----"
  SiteId......Site......Country
1......2......w3codebox......CN
2......4......Facebook......USA
3......6......Weibo......CN
[1] "----- FULL JOIN -----"
  SiteId......Site......Country.x......Country.y
1......2......w3codebox......CN......CN
2......4......Facebook......USA......USA
3......6......Weibo......CN......CN
4......7......<NA>......<NA>......USA
5......8......<NA>......<NA>......IN
[1] "----- LEFT JOIN -----"
  SiteId......Site.x......Country......Site.y......Country.x......Country.y
1......2......w3codebox......CN......w3codebox......CN......CN
2......4 Facebook......USA Facebook......USA......USA
3      6    Weibo      CN    Weibo        CN        CN
[1] "----- RIGHT JOIN -----"
  SiteId......Site.x......Country......Site.y......Country.x......Country.y
1......2......w3codebox......CN......w3codebox......CN......CN
2......4 Facebook......USA Facebook......USA......USA
3      6    Weibo      CN    Weibo        CN        CN
4      7     <NA>    <NA>      <NA>      <NA>       USA
5      8     <NA>    <NA>      <NA>      <NA>        IN

دمج وتقسيم البيانات

تستخدم اللغة R melt() و cast() الوظائف لدمج وتقسيم البيانات.

  • melt() :تحويل البيانات من تنسيق عرضي إلى تنسيق طويل.

  • cast() :تحويل البيانات من تنسيق طويل إلى تنسيق عرضي.

الشكل أدناه يوضح بشكل جيد وظائف melt() و cast() (سيتم شرح الأمثلة لاحقاً):

melt() تدمج كل عمود في كل عمود واحد في مجموعة البيانات،تنسيق جملة الوظيفة:

melt(data, ..., na.rm = FALSE, value.name = "value")

شرح المعلمات:

  • data:مجموعة البيانات.

  • ...:تمام المعلمات المقدمة لأي طريقة أخرى أو المعلمات الأخرى من أي طريقة أخرى.

  • na.rm:هل يتم حذف القيم المفقودة NA في مجموعة البيانات.

  • value.name اسم المتغير،للحفظ القيم.

قبل القيام بالأعمال التالية،دعونا نثبت المكتبات الضرورية:

# تثبيت المكتبة،MASS تتضمن العديد من الوظائف،الأدوات والمجموعات البيانية المتعلقة بالإحصاء
install.packages("MASS", repos = "https://mirrors.ustc.edu.cn/CRAN/") 
  
# melt() و cast() الوظائف تحتاج إلى مكتبة 
install.packages("reshape2", repos = "https://mirrors.ustc.edu.cn/CRAN/") 
install.packages("reshape", repos = "https://mirrors.ustc.edu.cn/CRAN/")

مثال على الاختبار:

# تحميل المكتبات
library(MASS) 
library(reshape2) 
library(reshape) 
  
# إنشاء جدول بيانات
id <- c(1, 1, 2, 2) 
time <- c(1, 2, 1, 2) 
x1 <- c(5, 3, 6, 2) 
x2 <- c(6, 5, 1, 4) 
mydata <- data.frame(id, time, x1, x2) 
  
# البيانات الأصلية
cat("البيانات الأصلية:\n") 
print(mydata) 
# دمج
md <- melt(mydata, id = c("id","time")) 
  
cat("\nالدمج بعد:\n") 
print(md)

نتيجة تنفيذ الكود أعلاه

البيانات الأصلية:
id time x1 x2
1  1    1  5  6
2  1    2  3  5
3  2    1  6  1
4  2    2  2  4
الدمج بعد:
id time variable value
1  1    1       x1     5
2  1    2       x1     3
3  2    1       x1     6
4 2 2 2 x1 2
5 1 1 2 x2 6
6 1 2 2 x2 5
7 2 1 2 x2 1
8 2 2 2 x2 4

استخدام دالة cast لاستعادة البيانات المدمجة، dcast() تعود بجدول بيانات، acast() تعود بفيector/مصفوفة/مجموعة.

نموذج جملة دالة cast():

dcast(
  data,
  formula,
  fun.aggregate = NULL,
  ...
  margins = NULL,
  subset = NULL,
  fill = NULL,
  drop = TRUE,
  value.var = guess_value(data)
)
acast(
  data,
  formula,
  fun.aggregate = NULL,
  ...
  margins = NULL,
  subset = NULL,
  fill = NULL,
  drop = TRUE,
  value.var = guess_value(data)
)

شرح المعلمات:

  • data: جدول البيانات المدمج.

  • formula: تنسيق البيانات المعاد تشكيلها، مشابه لـ x ~ y، x هو العنوان الافضل، y هو العنوان العمودي.

  • fun.aggregate: دالة تجميع، تستخدم لمعالجة قيم value.

  • margins: فيector بأسماء المتغيرات (يمكن أن تحتوي على "grand_col" و "grand_row")، تستخدم لتحليل الهوامش، إعداد TURE لحساب جميع الهوامش.

  • subset: تصفية النتائج بناءً على شرط، نمطها مشابه subset = .(متغير=="length").

  • drop: هل يجب الحفاظ على القيم الافتراضية.

  • value.var: يتبع هذا الحقل الذي سيتم معالجته.

# تحميل المكتبات
library(MASS) 
library(reshape2) 
library(reshape) 
  
# إنشاء جدول بيانات
id <- c(1, 1, 2, 2) 
time <- c(1, 2, 1, 2) 
x1 <- c(5, 3, 6, 2) 
x2 <- c(6, 5, 1, 4) 
mydata <- data.frame(id, time, x1, x2) 
# دمج
md <- melt(mydata, id = c("id","time")) 
# طباعة مجموعة البيانات المعاد تحويلها باستخدام دالة cast() 
البيانات_المعاد_تحويلها <- cast(md, id~متغير, معدل) 
  
print(البيانات_المعاد_تحويلها) 
  
cat("\n") 
time.cast <- cast(md, time~variable, mean) 
print(time.cast) 
cat("\n") 
id.time <- cast(md, id~time, mean) 
print(id.time) 
cat("\n") 
id.time.cast <- cast(md, id+time~variable) 
print(id.time.cast) 
cat("\n") 
id.variable.time <- cast(md, id+variable~time) 
print(id.variable.time) 
cat("\n") 
id.variable.time2 <- cast(md, id~variable+time) 
print(id.variable.time2)

نتيجة تنفيذ الكود أعلاه

id x1  x2
1  1  4 5.5
2  2  4 2.5
  time  x1  x2
1    1 5.5 3.5
2    2 2.5 4.5
  id   1 2
1  1 5.5 4
2  2 3.5 3
  id time x1 x2
1  1    1  5  6
2  1    2  3  5
3  2    1  6  1
4  2    2  2  4
  id variable 1 2
1  1       x1 5 3
2  1       x2 6 5
3  2       x1 6 2
4  2       x2 1 4
  id x1_1 x1_2 x2_1 x2_2
1  1    5    3    6    5
2  2    6    2    1    4