تغییر شکل مجدد داده ها در زبان برنامه نویسی آر
تغییر شکل داده ها در R در مورد تغییر روشی است که داده ها را در ردیف ها و ستون ها سازماندهی می کند. اغلب، پردازش داده ها در R با اتخاذ ورودی داده ها به عنوان دیتافریم؛ انجام می شود. به سادگی می توان داده ها را از ردیف ها و ستون های یک فریم دیتا استخراج کرد؛ اما ممکن است شرایطی پیش بیاید که فرمت فریم دیتای مورد نیاز ما با آن که در یافت کرده ایم؛ متفاوت باشد. آر توابع زیادی برای تقسیم کردن؛ ادغام و تغییر ردیف ها به ستون ها و برعکس؛ دارد.
اضافه کردن ستون ها و ردیف ها به فریم دیتا
با استفاده از تابع ()cbind می توانیم بردارهای چندتایی را برای ایجاد یک فریم دیتا، باهم به کار ببریم. همچنین می توانیم دو فریم دیتا را با استفاده از تابع ()rbind با هم ادغام کنیم.
# Create vector objects.
city <- c(“Tampa”,”Seattle”,”Hartford”,”Denver”)
state <- c(“FL”,”WA”,”CT”,”CO”)
zipcode <- c(33602,98104,06161,80294)
# Combine above three vectors into one data frame.
addresses <- cbind(city,state,zipcode)
# Print a header.
cat(“# # # # The First data framen”)
# Print the data frame.
print(addresses)
# Create another data frame with similar columns
new.address <- data.frame(
city = c(“Lowry”,”Charlotte”),
state = c(“CO”,”FL”),
zipcode = c(“80230″,”33949”),
stringsAsFactors = FALSE
)
# Print a header.
cat(“# # # The Second data framen”)
# Print the data frame.
print(new.address)
# Combine rows form both the data frames.
all.addresses <- rbind(addresses,new.address)
# Print a header.
cat(“# # # The combined data framen”)
# Print the result.
print(all.addresses)
زمانی که کد بالا را اجرا می کنیم؛ نتیجه زیر به دست می آید:
# # # # The First data frame
city state zipcode
[۱,] “Tampa” “FL” “33602”
[۲,] “Seattle” “WA” “98104”
[۳,] “Hartford” “CT” “6161”
[۴,] “Denver” “CO” “80294”
# # # The Second data frame
city state zipcode
۱ Lowry CO 80230
۲ Charlotte FL 33949
# # # The combined data frame
city state zipcode
۱ Tampa FL 33602
۲ Seattle WA 98104
۳ Hartford CT 6161
۴ Denver CO 80294
۵ Lowry CO 80230
۶ Charlotte FL 33949
ادغام فریم دیتاها
می توانیم دو فریم دیتا را با استفاده از تابع ()merge با هم ادغام کنیم. فریم دیتاها باید نام های ستون مشابهی داشته باشند که در آن ادغام باید انجام شوند.
در مثال زیر، فرض می کنیم که مجموعه داده های مربوط به دیابت در زنان ایالت پیما در هندوستان در کتابخانه ای به نام “MASS” در دسترس باشد. ما دو مجموعه داده را بر اساس مقادیر فشار خون (“bp”) و شاخص توده بدن (“bmi”) ادغام می کنیم. در انتخاب این دو ستون برای ادغام؛ اطلاعاتی که مقادیر این دو متغیر در هر دو مجموعه داده مطابقت داشته باشند؛ با هم ترکیب می شوند تا یک فریم داده واحد را تشکیل دهند.
library(MASS)
merged.Pima <- merge(x = Pima.te, y = Pima.tr,
by.x = c(“bp”, “bmi”),
by.y = c(“bp”, “bmi”)
)
print(merged.Pima)
nrow(merged.Pima)
زمانی که کد بالا را اجرا می کنیم؛ نتیجه زیر به دست می آید:
bp bmi npreg.x glu.x skin.x ped.x age.x type.x npreg.y glu.y skin.y ped.y
۱ ۶۰ ۳۳٫۸ ۱ ۱۱۷ ۲۳ ۰٫۴۶۶ ۲۷ No 2 125 20 0.088
۲ ۶۴ ۲۹٫۷ ۲ ۷۵ ۲۴ ۰٫۳۷۰ ۳۳ No 2 100 23 0.368
۳ ۶۴ ۳۱٫۲ ۵ ۱۸۹ ۳۳ ۰٫۵۸۳ ۲۹ Yes 3 158 13 0.295
۴ ۶۴ ۳۳٫۲ ۴ ۱۱۷ ۲۷ ۰٫۲۳۰ ۲۴ No 1 96 27 0.289
۵ ۶۶ ۳۸٫۱ ۳ ۱۱۵ ۳۹ ۰٫۱۵۰ ۲۸ No 1 114 36 0.289
۶ ۶۸ ۳۸٫۵ ۲ ۱۰۰ ۲۵ ۰٫۳۲۴ ۲۶ No 7 129 49 0.439
۷ ۷۰ ۲۷٫۴ ۱ ۱۱۶ ۲۸ ۰٫۲۰۴ ۲۱ No 0 124 20 0.254
۸ ۷۰ ۳۳٫۱ ۴ ۹۱ ۳۲ ۰٫۴۴۶ ۲۲ No 9 123 44 0.374
۹ ۷۰ ۳۵٫۴ ۹ ۱۲۴ ۳۳ ۰٫۲۸۲ ۳۴ No 6 134 23 0.542
۱۰ ۷۲ ۲۵٫۶ ۱ ۱۵۷ ۲۱ ۰٫۱۲۳ ۲۴ No 4 99 17 0.294
۱۱ ۷۲ ۳۷٫۷ ۵ ۹۵ ۳۳ ۰٫۳۷۰ ۲۷ No 6 103 32 0.324
۱۲ ۷۴ ۲۵٫۹ ۹ ۱۳۴ ۳۳ ۰٫۴۶۰ ۸۱ No 8 126 38 0.162
۱۳ ۷۴ ۲۵٫۹ ۱ ۹۵ ۲۱ ۰٫۶۷۳ ۳۶ No 8 126 38 0.162
۱۴ ۷۸ ۲۷٫۶ ۵ ۸۸ ۳۰ ۰٫۲۵۸ ۳۷ No 6 125 31 0.565
۱۵ ۷۸ ۲۷٫۶ ۱۰ ۱۲۲ ۳۱ ۰٫۵۱۲ ۴۵ No 6 125 31 0.565
۱۶ ۷۸ ۳۹٫۴ ۲ ۱۱۲ ۵۰ ۰٫۱۷۵ ۲۴ No 4 112 40 0.236
۱۷ ۸۸ ۳۴٫۵ ۱ ۱۱۷ ۲۴ ۰٫۴۰۳ ۴۰ Yes 4 127 11 0.598
age.y type.y
۱ ۳۱ No
۲ ۲۱ No
۳ ۲۴ No
۴ ۲۱ No
۵ ۲۱ No
۶ ۴۳ Yes
۷ ۳۶ Yes
۸ ۴۰ No
۹ ۲۹ Yes
۱۰ ۲۸ No
۱۱ ۵۵ No
۱۲ ۳۹ No
۱۳ ۳۹ No
پایگاه داده SQL Server رو قورت بده! بدون کلاس، سرعت 2 برابر، ماندگاری 3 برابر، پولسازی بلافاصله ... دانلود:
۱۴ ۴۹ Yes
۱۵ ۴۹ Yes
۱۶ ۳۸ No
۱۷ ۲۸ No
[۱] ۱۷
یکی از جالب ترین جنبه های برنامه نویسی R در مورد تغییر شکل داده ها طی چندین مرحله برای رسیدن به شکل مطلوب می باشد. توابع به کار رفته در این امر؛ ()melt و ()cast می باشد.
ما پایگاه داده ای را در نظر می گیریم که در کتابخانه ای که “MASS” نامیده می شود؛ ships را فراخوانی می کند:
library(MASS)
print(ships)
زمانی که کد بالا را اجرا کنیم؛ نتیجه زیر به دست می آید:
type year period service incidents
۱ A 60 60 127 0
۲ A 60 75 63 0
۳ A 65 60 1095 3
۴ A 65 75 1095 4
۵ A 70 60 1512 6
………….
………….
۸ A 75 75 2244 11
۹ B 60 60 44882 39
۱۰ B 60 75 17176 29
۱۱ B 65 60 28609 58
…………
…………
۱۷ C 60 60 1179 1
۱۸ C 60 75 552 1
۱۹ C 65 60 781 0
…………
…………
ذوب کردن داده ها (melt)
اکنون داده ها را برای سازماندهای آنها به اصطلاح ذوب کرده ایم و تمام ستون ها به غیر از نوع و سال را به ردیف های چندتایی تبدیل کرده ایم:
molten.ships <- melt(ships, id = c(“type”,”year”))
print(molten.ships)
زمانی که کد بالا را اجرا می کنیم؛ نتیجه زیر به دست می آید:
type year variable value
۱ A 60 period 60
۲ A 60 period 75
۳ A 65 period 60
۴ A 65 period 75
…………
…………
۹ B 60 period 60
۱۰ B 60 period 75
۱۱ B 65 period 60
۱۲ B 65 period 75
۱۳ B 70 period 60
………..
………..
۴۱ A 60 service 127
۴۲ A 60 service 63
۴۳ A 65 service 1095
………..
………..
۷۰ D 70 service 1208
۷۱ D 75 service 0
۷۲ D 75 service 2051
۷۳ E 60 service 45
۷۴ E 60 service 0
۷۵ E 65 service 789
………..
………..
۱۰۱ C 70 incidents 6
۱۰۲ C 70 incidents 2
۱۰۳ C 75 incidents 0
۱۰۴ C 75 incidents 1
۱۰۵ D 60 incidents 0
۱۰۶ D 60 incidents 0
………..
………..
شکل دهی به داده های ذوب شده
ما می توانیم داده های ذوب شده به فرم جدیدی شکل دهی کنیم که در آن هر نوع ship برای هر سال ایجاد می شود. این کار با استفاده از تابع ()cast انجام می شود.
recasted.ship <- cast(molten.ships, type+year~variable,sum)
print(recasted.ship)
زمانی که کد بالا را اجرا کنیم؛ نتیجه زیر به دست می آید:
type year period service incidents
۱ A 60 135 190 0
۲ A 65 135 2190 7
۳ A 70 135 4865 24
۴ A 75 135 2244 11
۵ B 60 135 62058 68
۶ B 65 135 48979 111
۷ B 70 135 20163 56
۸ B 75 135 7117 18
۹ C 60 135 1731 2
۱۰ C 65 135 1457 1
۱۱ C 70 135 2731 8
۱۲ C 75 135 274 1
۱۳ D 60 135 356 0
۱۴ D 65 135 480 0
۱۵ D 70 135 1557 13
۱۶ D 75 135 2051 4
۱۷ E 60 135 45 0
۱۸ E 65 135 1226 14
۱۹ E 70 135 3318 17
۲۰ E 75 135 542 1