如何在数据框中的列上提取(或子集)具有条件的所有行?

时间:2011-03-27 07:46:33

标签: r dataframe

我有以下数据框,并希望提取对应于状态== 1的同一组的所有行。

状态列为0或1.

df<-data.frame(time= rep(1:4,times=c(2,3,5,4)),status=c(0,0,1,1,0,0,0,0,0,0,1,0,0,0))

  Input Data 

   time status

1     1      0
2     1      0
3     2      1
4     2      1
5     2      0
6     3      0
7     3      0
8     3      0
9     3      0
10    3      0
11    4      1
12    4      0
13    4      0
14    4      0

所需输出(按顺序重新编号组列)。

time status

   1      1
   1      1
   1      0
   2      1
   2      0
   2      0
   2      0

我的实际data.frame的维度是10 ^ 6乘5的顺序。

感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

嗯,所以你想得到第二组和第四组,因为这两组都有一个状态值,对吗?从这两组你想得到整个输出?

如果是这样,那怎么样:

df <- data.frame(time = rep(1:4, times = c(2,3,5,4)),
                 status = c(0,0,1,1,0,0,0,0,0,0,1,0,0,0))

id <- unique(df[df$status == 1, "time"])
df2 <- df[df$time %in% id, ]

编辑:

df2$time <- factor(df2$time, labels = c(1,2))

答案 1 :(得分:1)

我有点困惑,因为你正在尝试做两件事 - 首先要提取状态为== 1的行,而在你想要的输出中,有些行为零。 这是提取状态== 1的行的方法之一。

df1 <- data.frame(time= rep(1:4,times=c(2,3,5,4)),status=c(0,0,1,1,0,0,0,0,0,0,1,0,0,0))
df1$time <- factor(df1$time)
df1s <- split(df1, df1$time)
df1l <- lapply(df1s, function(x) {
            x[x$status == 1, ]
        })
df1l <- do.call("rbind", df1l)

或其他方式

df2 <- df1[df1$status == 1, ]
df2.l <- split(df2, as.factor(df2$time))