R:按预定值拆分数据集
R: Splitting dataset by pre-determined values
我有这样的数据(但更大):
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(和编码)的新手,想知道如何最好地解决这个问题。
不确定这是否是最好的方法,但我会使用列表并使用这样的 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)),]
假设您的数据框是 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
Thanks! How would I go about saving these as separate data frames/sets (not sure on the correct terminology) so that I can then fit them individually?
怎么样
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))
这会将每个数据帧保存到目录 dir
下的 .csv
文件中。我已经使用 getwd()
来测试代码;您可以将其更改为特定文件夹。
我有这样的数据(但更大):
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(和编码)的新手,想知道如何最好地解决这个问题。
不确定这是否是最好的方法,但我会使用列表并使用这样的 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)),]
假设您的数据框是 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
Thanks! How would I go about saving these as separate data frames/sets (not sure on the correct terminology) so that I can then fit them individually?
怎么样
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))
这会将每个数据帧保存到目录 dir
下的 .csv
文件中。我已经使用 getwd()
来测试代码;您可以将其更改为特定文件夹。