【问题标题】:Subsetting dataframe using conditions and saving each subset as a new dataframe使用条件对数据框进行子集化并将每个子集保存为新的数据框
【发布时间】:2017-05-31 12:57:31
【问题描述】:

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

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

 1. v1 v2 v3 v4 v5 v6 
 2. 24 76 98 89 87 2
 3. 24 76 98 89 87 2
 4. 24 76 98 89 87 1
 5. 24 76 98 89 87 2
 6. 24 76 98 89 87 2

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

我尝试了 for 循环,但我对 R 和编程还很陌生,我被卡住了。

这是我迄今为止尝试过的:

> 
>
>
>x=1 
>for (i in 1:nrow(dataframe)) {
>     
>     if (dataframe[i,lastcolumn] == 2 && x==1) {
>         
>         start.event <- dataframe[i,]
>         
>     }
>     
>     if (dataframe[i,lastcolumn] != 2) {
>         end.event <- dataframe[i-1,]
>         
>     }
>     
>     else {
>         
>         df[1] <- dataframe( start.event:end.event , )
>         x = 1
>     }
>      }

非常感谢任何帮助。

提前致谢

【问题讨论】:

  • 每个保存的data.frame 是两行,还是程序应该抓取所有连续的行?
  • 程序应该抓取所有连续的行
  • 不确定这是否有帮助,但可能与此有关:which( diff(as.integer(rownames(dataframe[dataframe$V6 == 2,])) ) == 1)

标签: r


【解决方案1】:

这是使用基础 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

【讨论】:

  • 谢谢,我会试一试,然后回复你
【解决方案2】:

一种方法是根据v6 的更改时间创建组 (grp)。过滤掉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))

【讨论】:

    猜你喜欢
    • 2022-06-18
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 2021-10-20
    • 1970-01-01
    • 1970-01-01
    • 2021-03-23
    相关资源
    最近更新 更多