2

「serial」や「loc」などのデータを含む列が他にもたくさんあることを除けば、次のようなデータセットを使用しています。

start <-c(1,8,16,24,28,32)
end   <-c(4,9,20,27,30,45)
serial<-c(1,2,3,4,5,6)
loc<-c(8,63,90,32,89,75)
dataset<-data.frame(cbind(start,end, serial,loc))

ここで、各行は実際には連続する整数の実行を表します。これらの連続する整数のそれぞれを独自の行にし、その行の他の属性を保存したいと思います。「start」は実行の開始を示し、「end」は実行の終了を示します。したがって、たとえば、「データセット」の最初の行で、その行を4つの行に分割します。1つは1、1つは2、1つは3、もう1つは4です。同様に、「データセット」は2つの行に分割されます。1つは8行、もう1つは9行などです。

したがって、「データセット」の最初の2行だけを実行するための出力は次のようになります。

split serial loc
    1 1 8
    2 1 8
    3 1 8
    4 1 8
    8 2 63
    9 2 63
4

3 に答える 3

3

data.tableシリアルが一意の行識別子であると想定するソリューション

library(data.table)
DA <- as.data.table(dataset)
DB <- DA[,list(index = seq(start,end, by = 1), loc),by = serial]

serialが一意の行識別子でない場合は、

DB <- DA[, list(index = seq(start,end, by = 1), loc, serial), by = list(rowid = seq_len(nrow(DA)))]
于 2012-12-04T00:34:51.873 に答える
1

これがベースRに固執する1つのアプローチです。

temp <- mapply(seq, dataset$start, dataset$end)
dataset2 <- data.frame(serial = rep(dataset$serial, sapply(temp, length)),
                       index = unlist(temp),
                       loc = rep(dataset$loc, sapply(temp, length)))
list(head(dataset2), tail(dataset2))
# [[1]]
#   serial index loc
# 1      1     1   8
# 2      1     2   8
# 3      1     3   8
# 4      1     4   8
# 5      2     8  63
# 6      2     9  63
# 
# [[2]]
#    serial index loc
# 27      6    40  75
# 28      6    41  75
# 29      6    42  75
# 30      6    43  75
# 31      6    44  75
# 32      6    45  75
于 2012-12-04T02:49:11.927 に答える
0
# create the ranges
ranges <- mapply(seq, dataset$start, dataset$end)

# create the tables
tables <- lapply(seq(ranges), function(i) 
             cbind(split=ranges[[i]], dataset[i, c("serial", "loc")]) ) 

# to put all the tables in one matrix: 
do.call(rbind, tables)
于 2012-12-04T00:39:13.350 に答える