6

Rに、ある列に学生の名前があり、別の列に学生のマークがあるデータフレームがあるとします。これらのマークの範囲は20〜100です。

> mydata  
id  name   marks gender  
1   a1    56     female  
2   a2    37      male  

取得した点数の基準に基づいて生徒をグループに分け、各グループの点数の差が10以上になるようにします。各範囲の生徒数を示す関数テーブルを使用してみました。 20-30、30-40ですが、特定の範囲にマークがある生徒を選び、すべての情報を1つのグループにまとめてほしいと思います。どんな助けでも大歓迎です。

4

3 に答える 3

9

「すべての情報をグループにまとめる」とはどういう意味かわかりませんが、元のデータフレームを分割したデータフレームのリストを取得する方法は次のとおりです。各要素はマーク内の生徒のデータフレームです。 10の範囲:

mydata <- data.frame(
  id = 1:100,
  name = paste0("a",1:100),
  marks = sample(20:100,100,TRUE),
  gender = sample(c("female","male"),100,TRUE))

split(mydata,cut(mydata$marks,seq(20,100,by=10)))
于 2012-09-07T09:54:36.587 に答える
5

複数のセットがある場合でも、@Sachaの答えで十分だと思います。

元の投稿でデータを「グループ化」する方法を明示的に指定しておらず、2番目のデータセットを追加したコメントで、これらを最初に「マージ」する予定があるかどうかを明示的に指定していません(rbindコメントで推奨されているように、十分です)。

それで、ここにいくつかのオプションがあり、それぞれが出力の詳細または有用性のレベルが異なります。うまくいけば、それらの1つがあなたのニーズに合っています。

まず、サンプルデータをいくつか示します。

# Two data.frames (myData1, and myData2)
set.seed(1)
myData1 <- data.frame(id = 1:20, 
                      name = paste("a", 1:20, sep = ""),
                      marks = sample(20:100, 20, replace = TRUE),
                      gender = sample(c("F", "M"), 20, replace = TRUE))
myData2 <- data.frame(id = 1:17,
                      name = paste("b", 1:17, sep = ""),
                      marks = sample(30:100, 17, replace = TRUE),
                      gender = sample(c("F", "M"), 17, replace = TRUE))

第二に、「グループ化」のためのさまざまなオプション。

  • オプション1 :与えられた条件からの値とそれに一致する値を(aでlist)返します。この例では、2つのリストが作成されます。myData1myData2data.frame

    lapply(list(myData1 = myData1, myData2 = myData2), 
           function(x) x[x$marks >= 30 & x$marks <= 50, ])
    
  • オプション2list :各データセットを2つに分割して返します。1つはFALSE(指定された条件に一致しません)、もう1つはTRUE(指定された条件に一致します)です。つまり、4つのグループを作成します。この例では、それぞれ2つのリストアイテムを持つネストされたリストになりますdata.frame

    lapply(list(myData1 = myData1, myData2 = myData2), 
           function(x) split(x, x$marks >= 30 & x$marks <= 50))
    
  • オプション3:最初のものよりも柔軟性があります。これは基本的に、@Sachaの例をリストに拡張したものです。どこにでも休憩を入れることができるので、私の考えでは、これは本当に便利なオプションです。この例では、それぞれが複数のリストを持つ2つのリストアイテムを持つネストされたリストになりますdata.frame

    lapply(list(myData1 = myData1, myData2 = myData2),
           function(x) split(x, cut(x$marks, 
                                    breaks = c(0, 30, 50, 75, 100), 
                                    include.lowest = TRUE)))
    
  • オプション4:最初にデータを結合し、オプション1で説明したグループ化方法を使用します。この例ではdata.frame、指定された条件に一致する値のみを含む単一のデータになります。

    # Combine the data. Assumes all the rownames are the same in both sets
    myDataALL <- rbind(myData1, myData2)
    # Extract just the group of scores you're interested in
    myDataALL[myDataALL$marks >= 30 & myDataALL$marks <= 50, ]
    
  • オプション5:結合されたデータを使用してsplit、データを2つのグループに分けます。1つは指定された条件に一致し、もう1つは一致しません。この例では、2つdata.frameのsを持つリストが作成されます。

    split(myDataALL, myDataALL$marks >= 30 & myDataALL$marks <= 50)
    

これらのオプションの1つがあなたのニーズに役立つことを願っています!

于 2012-09-07T12:20:18.833 に答える
1

私は同じ種類の問題を抱えていました、そしてスタックオーバーフローに関するいくつかの答えを研究した後、私は次の解決策を思いつきました:

ステップ1:範囲を定義するステップ2:範囲に含まれる要素を見つけるステップ3:プロットする

サンプルコードは次のとおりです。

   range = NULL
   for(i in seq(0, max(all$downlink), 2000)){
    range <- c(range, i)
   }
   counts <- numeric(length(range)-1);
   for(i in 1:length(counts)) {
   counts[i] <- length(which(all$downlink>=range[i] & all$downlink<range[i+1]));
   }
   countmax = max(counts)
   a = round(countmax/1000)*1000
   barplot(counts, col= rainbow(16), ylim = c(0,a))
于 2015-07-07T14:25:07.367 に答える