2016-08-17 54 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)),]