2016-08-17 168 views
0

我有看起来像这样(但更大)的数据:R:通过预先确定的值分割数据集

Pos Value 
    0 66.81967 
    1 66.36885 
    2 65.79508 
    3 65.27049 
    4 64.88525 
    5 64.97541 
    6 65.39344 
    7 65.99181 
    8 66.63115 
    9 66.95901 
    10 66.89344 
    11 66.44262 
    12 65.90984 
    13 65.49181 
    14 65.35246 

我已确定的最大值和保存的每个的位置的值,以像这样的载体:

9 19 30 42 56 69 80 92 107 118 130 143 154 164 176 188 199 211 
222 234 245 

我现在要基于所述最大值的值来分割数据,所以对于样品数据我愿意数据集分割成的值的位置0-> 9和成用于位置的值10-15,并将这些子集中的每一个保存到它们自己的矢量中。

我是R(和编码)的新手,想知道如何才能做到最好。

+1

为什么'10-15'?不是'10-19'吗? – user2100721

+0

我说10-15,因为我只提供了15个数据(或者说,我认为我有,现在我注意到我只提供了14)。 – GeorgeSBF

回答

1

假设你的数据帧dat和你的最大价值是在矢量maxima,您可以使用

split(dat, cut(dat$Pos, breaks = maxima, include.lowest = TRUE)) 

对于示例数据帧:

dat <- 
structure(list(Pos = 0:14, Value = c(66.81967, 66.36885, 65.79508, 
65.27049, 64.88525, 64.97541, 65.39344, 65.99181, 66.63115, 66.95901, 
66.89344, 66.44262, 65.90984, 65.49181, 65.35246)), .Names = c("Pos", 
"Value"), class = "data.frame", row.names = c(NA, -15L)) 

,并在你的范围内最大的前几个值:

maxima <- c(0, 10, 19) 

我的代码给你数据的列表框

#$`[0,10]` 
# Pos Value 
#1 0 66.81967 
#2 1 66.36885 
#3 2 65.79508 
#4 3 65.27049 
#5 4 64.88525 
#6 5 64.97541 
#7 6 65.39344 
#8 7 65.99181 
#9 8 66.63115 
#10 9 66.95901 
#11 10 66.89344 
# 
#$`(10,19]` 
# Pos Value 
#12 11 66.44262 
#13 12 65.90984 
#14 13 65.49181 
#15 14 65.35246 

如果你不想数据帧,但只是Value,使用

split(dat$Value, cut(dat$Pos, breaks = maxima, include.lowest = TRUE)) 

#$`[0,10]` 
# [1] 66.81967 66.36885 65.79508 65.27049 64.88525 64.97541 65.39344 65.99181 
# [9] 66.63115 66.95901 66.89344 
# 
#$`(10,19]` 
# [1] 66.44262 65.90984 65.49181 65.35246 

谢谢!我会如何将这些保存为单独的数据框/集合(不能确定正确的术语),以便我可以单独适合它们?

如何

lst <- split(dat, cut(dat$Pos, breaks = maxima, include.lowest = TRUE)) 
dir <- getwd() 
lapply(seq_len(length(lst)), 
     function (i) write.csv(lst[[i]], file = paste0(dir,"/",names(lst[i]), ".csv"), row.names = FALSE)) 

这将每个数据帧保存到一个文件.csv目录下dir。我用getwd()来测试代码;您可以将其更改为特定的文件夹。

+0

谢谢!我会如何将这些保存为单独的数据框/集合(不能确定正确的术语),以便我可以单独适合它们? – GeorgeSBF

+0

再次感谢您!我接受了答案。最后一件事 - 当我运行该代码时,它只保存第二个分区以后的部分,即第一个分区(0-10)不会保存为.csv。你知道这可能是为什么吗? – GeorgeSBF

1

不知道这是最好的方法,但我会用一个列表工作,并使用一个for循环像这样(未经):

maxpos <- c(9, 19, 30) 
ans <- list() 
prev <- 1 
for (i in seq.int(length(maxpos))) { 
    ans[[i]] <- dataset[seq(prev, maxpos[i]),] 
    prev <- maxpos[i+1] 
} 
ans[[length(maxpos)+1]] <- dataset[seq(maxpos[length[maxpos]]+1,nrow(dataset)),]