6

次のdata.frameを分割するにはどうすればよいですか

df <- data.frame(var1 = c("a", 1, 2, 3, "a", 1, 2, 3, 4, 5, 6, "a", 1, 2), var2 = 1:14)

の/グループのリストに

a 1
1 2
2 3
3 4

a 5
1 6
2 7
3 8
4 9
5 10
6 11

a 12
1 13
2 14

したがって、基本的に、列1の値「a」はデータフレームを分割するタグ/識別子です。分割関数については知っていますが、別の列を追加する必要があります。例からわかるように、グループのサイズはさまざまであるため、ニーズに合わせてこのようなダミー列を自動的に作成する方法がわかりません。

それについて何かアイデアはありますか?

乾杯、

スヴェン

4

2 に答える 2

12

インデックスベクトルのどの値が「a」に等しいかを見つけ、それに基づいてグループ化変数を作成し、splitを使用することができます。

df[,1] == "a"
# [1]  TRUE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE
#[13] FALSE FALSE
cumsum(df[,1] == "a")
# [1] 1 1 1 1 2 2 2 2 2 2 2 3 3 3
split(df, cumsum(df[,1] == "a"))
#$`1`
#  var1 var2
#1    a    1
#2    1    2
#3    2    3
#4    3    4
#
#$`2`
#   var1 var2
#5     a    5
#6     1    6
#7     2    7
#8     3    8
#9     4    9
#10    5   10
#11    6   11
#
#$`3`
#   var1 var2
#12    a   12
#13    1   13
#14    2   14
于 2012-07-09T19:56:46.390 に答える
0

データフレームの最初の列全体をループし、数値以外の文字の位置をベクトルに保存するループを作成できます。したがって、次のようになります。

data <- df$var1 #this gives you a vector of the values you'll sort through

positions <- c()

for (i in seq(1:length(data))){
    if (is.numeric(data[i]) == TRUE) {
        #nothing
    }
    else positions <- append(positions, i) #saves the positions of the non-numeric characters
}

これらの位置を使用すると、そこからデータフレームを分割してアクセスする際に問題が発生することはありません。位置ベクトルの値の間でシーケンスを使用するだけです。

于 2012-07-09T19:58:59.207 に答える