首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R:按预先确定的值分割数据集

R:按预先确定的值分割数据集
EN

Stack Overflow用户
提问于 2016-08-17 16:05:21
回答 2查看 50关注 0票数 0

我有这样的数据(但更大):

代码语言:javascript
复制
   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 

我已经确定了最大值,并将每个位置值保存为如下所示的向量:

代码语言:javascript
复制
 9  19  30  42  56  69  80  92 107 118 130 143 154 164 176 188 199 211
 222 234 245

现在我想根据maxima的值来拆分数据,因此对于样本数据,我希望将数据集拆分为位置0->9的值和位置10-15的值,并将每个子集保存到它们自己的向量中。

我对R(和编码)还不熟悉,我想知道如何最好地做到这一点。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-17 16:22:03

假设数据帧为dat,且最大值位于向量maxima中,则可以使用

代码语言:javascript
复制
split(dat, cut(dat$Pos, breaks = maxima, include.lowest = TRUE))

对于您的示例数据框架:

代码语言:javascript
复制
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))

范围内的极大值的前几个值:

代码语言:javascript
复制
maxima <- c(0, 10, 19)

我的代码给出了数据帧的列表。

代码语言:javascript
复制
#$`[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,请使用

代码语言:javascript
复制
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

谢谢!我将如何将它们保存为单独的数据帧/集(不确定正确的术语),这样我就可以将它们单独安装起来了。

怎么样

代码语言:javascript
复制
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下的一个dir文件中。我使用getwd()来测试代码;您可以将它更改为特定的文件夹。

票数 1
EN

Stack Overflow用户

发布于 2016-08-17 16:18:41

不确定这是否是最好的方法,但是我会使用一个列表并使用像这样的for循环(未经测试):

代码语言:javascript
复制
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)),]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39001436

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档