1

長い形式の不均衡な縦断データがあります。完全な情報が含まれていないすべてのケースを除外したいと思います。つまり、8回繰り返さないすべてのケースを意味します。誰かが解決策を見つけるのを手伝ってくれますか?

例の下: 3 つのサブジェクト {A、B、および C} があります。A と B については 8 つの情報がありますが、C については 2 つしかありません。繰り返し測定が 8 回未満であるという情報に基づいて、C が存在する行を削除するにはどうすればよいですか?

temp = scan()
A 1 1 1 0
A 1 1 0 1
A 1 0 0 0
A 1 1 1 1
A 0 1 0 0
A 1 1 1 0
A 1 1 0 1
A 1 0 0 0
B 1 1 1 0
B 1 1 0 1
B 1 0 0 0
B 1 1 1 1
B 0 1 0 0
B 1 1 1 0
B 1 1 0 1
B 1 0 0 0
C 1 1 1 1
C 0 1 0 0

何か助けはありますか?

4

2 に答える 2

5

変数名がV1, V2... などであると仮定すると、ここに 1 つのアプローチがあります。

temp[temp$V1 %in% names(which(table(temp$V1) == 8)), ]

は、正確に 8 つのケースを持つ列table(temp$V1) == 8の値に一致します。V1このnames(which(...部分は、 を使用して照合できる基本的な文字ベクトルを作成し%in%ます。

そしてもう一つ:

temp[ave(as.character(temp$V1), temp$V1, FUN = length) == "8", ]
于 2012-12-13T18:37:46.567 に答える
1

別のアプローチを次に示します。

temp <- read.table(text="
A 1 1 1 0
A 1 1 0 1
A 1 0 0 0
A 1 1 1 1
A 0 1 0 0
A 1 1 1 0
A 1 1 0 1
A 1 0 0 0
B 1 1 1 0
B 1 1 0 1
B 1 0 0 0
B 1 1 1 1
B 0 1 0 0
B 1 1 1 0
B 1 1 0 1
B 1 0 0 0
C 1 1 1 1
C 0 1 0 0", header=FALSE)

do.call(rbind, 
        Filter(function(subgroup) nrow(subgroup) == 8, 
               split(temp, temp[[1]])))

splitdata.frame最初の列で分割し、Filter8 行を持たないサブグループを削除します。最後にdo.call(rbind, ...)、残りのサブグループを 1 つの に戻しdata.frameます。

の最初の列tempcharacter( ではなくfactor、 で確認できますstr(temp)) で、行がサブグループ別に並べられている場合は、次のこともできます。

with(rle(temp[[1]]), temp[rep(lengths==8, times=lengths), ])
于 2012-12-13T18:40:19.550 に答える