子问题。我更喜欢使用内置的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))
答案 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,]