如何使用R中的条件语句将数据帧拆分为多个数据帧

时间:2014-01-07 23:00:40

标签: r split dataframe conditional-statements

我的数据如下:

time <- c(1:20)
temp <- c(2,3,4,5,6,2,3,4,5,6,2,3,4,5,6,2,3,4,5,6)
data <- data.frame(time,temp)

这是我数据的基本表示。如果您绘制此图,您可以很容易地看到有4个向上倾斜的数据组。我想将原始数据帧拆分为这4个“子集”,以便我可以对它们进行计算,如“mean”,“max”,“min”和“std”。我想使用split()但它只会根据因子级别进行拆分。我希望能够提供split条件语句,例如split if:diff(data$temp) > -2

我的问题实际上比这复杂得多,但是有一个像split这样的函数可以让我根据条件语句创建新的数据框吗?因为基于因子水平分裂。

全部谢谢!

2 个答案:

答案 0 :(得分:4)

诀窍是将条件语句转换为可被视为一个因素的东西。在这个特定的例子中:

tmp <- c(1,diff(data[[2]]))
#  [1]  1  1  1  1  1 -4  1  1  1  1 -4  1  1  1  1 -4  1  1  1  1
tmp2 <- tmp < 0
# [1] FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE  TRUE FALSE
# [13] FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE
tmp3 <- cumsum(tmp2)
#  [1] 0 0 0 0 0 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3
split(data, tmp3)
# $`0`
#   time temp
# 1    1    2
# 2    2    3
# 3    3    4
# 4    4    5
# 5    5    6
# 
# $`1`
#    time temp
# 6     6    2
# 7     7    3
# 8     8    4
# 9     9    5
# 10   10    6
# 
# $`2`
#    time temp
# 11   11    2
# 12   12    3
# 13   13    4
# 14   14    5
# 15   15    6
# 
# $`3`
#    time temp
# 16   16    2
# 17   17    3
# 18   18    4
# 19   19    5
# 20   20    6

答案 1 :(得分:0)

如果您的数据表现不佳,可以使用cut()创建分类变量。唯一的“问题”是它是100%手动。

time <- c(1:200)
temp <- (time %% 51) * (-1)^(time %/% 51) + rnorm(200)
data <- data.frame(time,temp) 

layout(matrix(c(1, 1, 2, 2, 3, 4, 5 ,6), nrow=2))
plot(data, main='All data')

time2 <- cut(time, c(0, 50, 101, 152, 200))
plot(data, col=time2, main='All data, by time2')
data2 <- split(data, time2)

for (i in 1:4) {
 plot(data2[[i]], main=names(data2)[i])
}

编辑:

现在是100%自动流程:

time <- c(1:200)
temp <- (time %% 51) * (-1)^(time %/% 51) + rnorm(200)
data <- data.frame(time,temp) 

layout(matrix(c(1, 1, 2, 2, 3, 4, 5 ,6), nrow=2))
plot(data, main='All data')


tol <- 10 # Here you set the minimum value to consider as a structural break
time2 <- cut(time, c(0, which(abs(diff(data$temp)) >= tol), max(time)), rigth=FALSE)

plot(data, col=time2, main='All data, by time2')
data2 <- split(data, time2)

for (i in 1:4) {
 plot(data2[[i]], main=names(data2)[i])
}