如何在包含数值的第一行之后对所有内容进行子集化

时间:2017-08-05 06:21:22

标签: r subset

子问题。我更喜欢使用内置的R函数,但不一定如此。我相信解决方案很简单,但我是R的新手。

以下是示例数据:

df <- data.frame(year = c("2001", "2002", "2003", "2004", "2005", "2006"),
              C1 = c("a", "b", "c", "d", "e", "f"), 
              C2 = c(NA, NA, 35, 20, NA, 50),
              C3=1:6)

输出如下:

  year C1 C2 C3
1 2001  a NA  1
2 2002  b NA  2
3 2003  c 35  3
4 2004  d 20  4
5 2005  e NA  5
6 2006  f 50  6

我想在第C2行选择从第一行开始的所有列,并使用数值(即&gt; 0),这样我的输出将如下所示:

  year C1 C2 C3
1 2003  c 35  3
2 2004  d 20  4
3 2005  e NA  5
4 2006  f 50  6

请注意,不排除C2列第3行中的NA(这是所需的)。我尝试了以下内容,但不包括NA行:

new_df=subset(df, C2>0)

我也试过这个,但也不起作用:

new_df=subset(df, C2>0 | is.na(C2))

3 个答案:

答案 0 :(得分:2)

使用基础R,您可以创建一个自定义函数,该函数将数据框和要用于子菜单的列作为输入,

f1 <- function(df, x){
  i1 <- which(is.na(x))
  v1 <- i1==1
  l2 <- c(v1[1], diff(i1) == 1)
  ifelse(v1, return(df[-which(l2),]), 
         return(df))
}

#apply the function
f1(df, df$C2)

给出,

  year C1 C2 C3
3 2003  c 35  3
4 2004  d 20  4
5 2005  e NA  5
6 2006  f 50  6

答案 1 :(得分:2)

df[which(!is.na(df$C2))[1]:nrow(df),]

输出:

  year C1 C2 C3
3 2003  c 35  3
4 2004  d 20  4
5 2005  e NA  5
6 2006  f 50  6

答案 2 :(得分:2)

以下是使用tidyverse

的选项
library(dplyr)
df %>%
   slice(which(!is.na(C2)):n())
# A tibble: 4 x 4
#    year     C1    C2    C3
#  <fctr> <fctr> <dbl> <int>
#1   2003      c    35     3
#2   2004      d    20     4
#3   2005      e    NA     5
#4   2006      f    50     6

cumsum/filter

df %>%
     filter(cumsum(!is.na(C2))>0)
#  year C1 C2 C3
#1 2003  c 35  3
#2 2004  d 20  4
#3 2005  e NA  5
#4 2006  f 50  6

这些方法也可以使用base R

完成
df[cumsum(!is.na(df$C2)) > 0,]