1

次のようにデータ フレームを分割する関数が必要です。

q1  q2  q3  q4
1   4   0   33
8   5   33  44
na  na  na  na
na  na  na  na
3   33  2   66
4   2   3   88
6  44   5   99

2 つのデータフレームを取得します。

d1
q1  q2  q3  q4
1   4   0   33
8   5   33  44

d2
3   33  2     66
4   2   3     88
6   44  5     99

d1 と d2 の obs は固定されていません。これは、データフレーム内の obs と、NA である obs の数がわからないことを意味します。

4

2 に答える 2

1

DFがデータフレームであるとします。分割基準が正確に指定されていないため、すべてがNAs の行が分割行であると仮定します。他の基準が適切に変更されている場合は、最初の行を次のように変更します。

isNA <- apply(is.na(DF), 1, all)
split(DF[ !isNA, ], cumsum( isNA )[ !isNA ])
于 2013-03-23T18:24:07.823 に答える
0

まず、「na」が実際のNA値に変換されるようにデータを読み込みます。

mydf <- read.table(
  header = TRUE, 
  na.strings="na", 
  text = "q1 q2 q3 q4
          1 4 0 33
          8 5 33 44
          na na na na
          3 33 2 66
          4 2 3 88
          6 44 5 99")

data.frame第二に、あなたの:を分割する場所を見つけます

# Find the rows where *all* the values are `NA`
RLE <- rle(rowSums(is.na(mydf)) == ncol(mydf))$lengths
# Use that to create "groups" of rows
RLE2 <- rep(seq_along(RLE), RLE)
# Replace even numbered rows with NA -- we don't want them
RLE2[RLE2 %% 2 == 0] <- NA

第三に、data.frame

split(mydf, RLE2)
# $`1`
#   q1 q2 q3 q4
# 1  1  4  0 33
# 2  8  5 33 44
# 
# $`3`
#   q1 q2 q3 q4
# 4  3 33  2 66
# 5  4  2  3 88
# 6  6 44  5 99

ただし、「これは、データフレーム内のobsと、NAであるobsの数がわからないことを意味します」というあなたの声明は、実際には明確ではないため、これはすべていくぶん推測に基づく作業です。ここでは、値の完全な行に遭遇するたびにデータを分割することを想定していNAます。

于 2013-03-23T18:11:39.190 に答える