حلقة حفظ أسماء المتغيرات R

4

أود إنشاء حلقة على 3 إطارات بيانات وإنشاء مجموعات فرعية لكل منها وتعيين مجموعات فرعية جديدة اسمًا جديدًا. كيف يمكنني التكرار فوق إطارات البيانات الثلاثة هذه مع الحفاظ على الأسماء؟

على سبيل المثال ، لدي 3 إطارات بيانات: التفاح والتوت والعنب. عند إنشاء حلقة ، هل هناك طريقة لتعيين إطارات بيانات مجموعة فرعية جديدة أسماء مشابهة لإطار البيانات الأصلي الخاص بها؟

مكتوب بدون حلقة ، هذا ما سيبدو عليه الرمز.

apples <- data.frame(type = c("red", "golden", "green"), number = c(1, 2, 3))
berries <- data.frame(type = c("blueberry", "raspberry", "mulberry"), number = c(1, 2, 3))
grapes <- data.frame(type = c("red", "green", "sour"), number = c(1, 2, 3))

apples_large <- subset(apples, number > 2)
apples_small <- subset(apples, number < 2)

berries_large <- subset(berries, number > 2)
berries_small <- subset(berries, number < 2)

grapes_large <- subset(grapes, number > 2)
grapes_small <- subset(grapes, number < 2) 

3 الاجابة

4
افضل جواب

ضع كائنات مجموعة البيانات في list و split بواسطة عمود "الرقم" للحصول على تداخل list من مجموعات البيانات

lapply(list(apples, berries, grapes), function(x) split(x, x$number>2)) 

إذا أنشأنا مسما list ، يصبح من السهل تحديد أو استخراج المكونات الفردية

out <- lapply(mget(c("apples", "berries", "grapes")),
  function(x) split(x, c("small", "large")[(x$number > 2) + 1]))
out$apples$small

كما ذكرMonMinton إذا كنا بحاجة إلى إسقاط الصفوف التي تحتوي على "رقم" 2

lapply(mget(c("apples", "berries", "grapes")),
       function(x) {x1 <- subset(x, number != 2)
             split(x1, c("small", "large")[(x1$number > 2) + 1])})   
:مؤلف
3
افضل جواب

إنها فكرة سيئة إنشاء العديد من الكائنات في البيئة العالمية ، بدلاً من الاحتفاظ بها في قائمة ، ولكن هذا سيفعل ذلك:

tmp <- c("apples", "berries", "grapes")

for (i in 1:length(tmp)){
  assign(paste0("big_", tmp[i]), subset(get(tmp[i]), number > 2))
  assign(paste0("small_", tmp[i]), subset(get(tmp[i]), number < 2))
}

(او استعمل seq_along(tmp) بدلا من 1:length(tmp) )

لاحظ استخدام assign للمخرجات و get للمدخلات.

:مؤلف
1
افضل جواب

أولا ، ضع data.frames الى list ، ثم قم بتعريف دالة تصنف الصفوف. الآن انت تستطيع split كل عنصر من عناصر القائمة حسب المصنف الخاص بك في lapply .

fruits <- list(
    apples=data.frame(type = c("red", "golden", "green"), number = c(1, 2, 3)),
    berries=data.frame(type = c("blueberry", "raspberry", "mulberry"), number = c(1, 2, 3)),
    grapes=data.frame(type = c("red", "green", "sour"), number = c(1, 2, 3))
)

clsfy <- function(num) {
    if (num>2) {
        ret <- "Large"
    } else if (num<2) {
        ret <- "Small"
    } else {
        ret <- NA ## if no condition is met, discard this row
    }
    return(ret)
}

fruits2 <- lapply(fruits, function(fr) {
    split(fr, sapply(fr$number, clsfy))
})

عند هذه النقطة ، يبدو أن Fruit2 مثل هذا:

>     fruits2
$apples
$apples$Large
   type number
3 green      3

$apples$Small
  type number
1  red      1


$berries
$berries$Large
      type number
3 mulberry      3

$berries$Small
       type number
1 blueberry      1


$grapes
$grapes$Large
  type number
3 sour      3

$grapes$Small
  type number
1  red      1

لتعميم التصنيفات باستخدام أكثر من عمود واحد لكل صف ، يمكنك استخدامه apply بدلا من sapply وإعادة تعريف الخاص بك clsfy تعمل بحيث تأخذ الصف بأكمله: split(fr, apply(fr, 1, clsfy)) . من ناحية أخرى ، إذا كانت حالتك ثنائية بسيطة حقًا ، إذن ifelse أفضل من sapply(x$number, clsfy) .

:مؤلف

أسئلة ذات صلة

فوق
قائمة طعام