我有一个数据集,其中包含每列中的不同测量值,最后一列包含值(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
我真的很感激任何帮助。
提前致谢
答案 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))