使用条件对数据框进行子集并将每个子集保存为新的数据帧

时间:2017-05-31 12:57:31

标签: r

我有一个数据集,其中包含每列中的不同测量值,最后一列包含值(0,1,2)。

例如,假设我的数据框看起来像这样(忽略v1:v5的值)

assert_exit_status 'lambda status -> [[ $status -ne 0 ]] && echo Status is $status.' lls

我感兴趣的是v6列的值,我想提取值等于2的行。在上面的例子中,我想提取前两行并将它们保存为新的数据帧并提取第5行和第6行作为不同的数据帧并保存。更清楚的是,当我的值等于2并且是连续的时,我需要将它们保存为新的数据帧。当值不同时,我需要循环忽略它并再次找到感兴趣的值(即2)。如果我的数据帧在最后一列中有70块连续2,我需要最终得到70个数据帧。

我试过循环,但我对R和编程很新,我被卡住了。

这是我到目前为止所尝试的:

Status is 127

我真的很感激任何帮助。

提前致谢

2 个答案:

答案 0 :(得分:3)

这是使用基础R的一种方式

#use rle to set indicator variable for groups of 2
rl <- rle(df$v6)
rl$values <- cumsum(rl$lengths==2)
df$ind <- inverse.rle(rl)

#filter out other values from df
df <- df[df$v6==2,]

#split by indicator (and remove it)
dflist <- split(df[,-ncol(df)],df$ind)

dflist #elements of list are named after number of 2-group
$`1`
   v1 v2 v3 v4 v5 v6
2. 24 76 98 89 87  2
3. 24 76 98 89 87  2

$`2`
   v1 v2 v3 v4 v5 v6
5. 24 76 98 89 87  2
6. 24 76 98 89 87  2

答案 1 :(得分:2)

一种方法是根据grp更改时间创建群组(v6)。过滤掉v6 != 2的所有行并在grp

上拆分
new_d <- subset(transform(df, grp = cumsum(c(1, diff(v6) != 0))), v6 == 2)
split(new_d, new_d$grp)

#$`1`
#  v1 v2 v3 v4 v5 v6 grp
#1 24 76 98 89 87  2   1
#2 24 76 98 89 87  2   1

#$`3`
#  v1 v2 v3 v4 v5 v6 grp
#4 24 76 98 89 87  2   3
#5 24 76 98 89 87  2   3

或通过dplyr

library(dplyr)

new_d <- df %>% 
   mutate(grp = cumsum(c(1, diff(v6) != 0))) %>% 
   filter(v6 == 2) 

split(new_d, new_d$grp)

使用数据

structure(list(v1 = c(24L, 24L, 24L, 24L, 24L), v2 = c(76L, 76L, 
76L, 76L, 76L), v3 = c(98L, 98L, 98L, 98L, 98L), v4 = c(89L, 
89L, 89L, 89L, 89L), v5 = c(87L, 87L, 87L, 87L, 87L), v6 = c(2L, 
2L, 1L, 2L, 2L)), .Names = c("v1", "v2", "v3", "v4", "v5", "v6"
), class = "data.frame", row.names = c(NA, -5L))