Dataframe 如果其他两列不符合筛选条件,则从列中获取值

Dataframe 如果其他两列不符合筛选条件,则从列中获取值,dataframe,Dataframe,我的数据框如下所示: Name Value Value1 C1 C2 C3 A 1 2 NA NA NA A NA 2 NA 2 NA A 1 2 NA 2 NA A 1 2 NA 2 NA A 1 2 NA 2 NA

我的数据框如下所示:

 Name     Value   Value1  C1   C2    C3
  A        1       2      NA   NA    NA
  A        NA      2      NA   2     NA
  A        1       2      NA   2     NA
  A        1       2      NA   2     NA
  A        1       2      NA   2     NA
  B        NA      1      NA   2     NA
  B        NA      2      NA   2     NA
  B        1       NA     NA   2     NA
  B        1       NA     NA   2     NA
  C        1       5      NA   2     NA
  C        1       5      NA   2     NA

  dt <- as.data.table(df)
  new <- dt[is.na(`Value`) == FALSE & is.na(`Value1`) == FALSE,]
有没有办法做到这一点,但我不想过滤行,而是希望在我的列名中包含所有不符合筛选条件的字母。
因此,在本例中,我想返回A和B,因为A有一行的Value和Value1列都没有非na值,而B根本不符合标准。

您可以使用
作为否定运算符。(事实上,您应该已经在使用它了,而不是
==FALSE
。此外,除非您的列名很奇怪(它们有空格或其他东西),否则您不需要反勾号。)


我可能误解了你的意思,但就我所能读到的描述而言,我认为你的意思是获取至少有一行
NA
的特定
Name

这可以通过使用
ave
来完成,我们检查
Value
Value1
列中是否至少有一个
NA
,然后选择整个组(
Name


@Ronaksah已经指出(使用
base-R
)如何
筛选
名称
的行,这些行在
值1
列中至少得到1
NA

但是,OP可能只是寻找
唯一的
名称,而不是行的完整子集。在
dplyr
中,可以这样做:

library(dplyr)

df %>% group_by(Name) %>%
  filter_at(vars(starts_with("Value")), any_vars(is.na(.))) %>%  #Either Value or Value1 
  select(Name) %>% distinct()

# Name 
# <chr>
# 1 A    
# 2 B 
数据:

df <- read.table(text = 
"Name     Value   Value1  C1   C2    C3
A        1       2      NA   NA    NA
A        NA      2      NA   2     NA
A        1       2      NA   2     NA
A        1       2      NA   2     NA
A        1       2      NA   2     NA
B        NA      1      NA   2     NA
B        NA      2      NA   2     NA
B        1       NA     NA   2     NA
B        1       NA     NA   2     NA
C        1       5      NA   2     NA
C        1       5      NA   2     NA",
header = TRUE, stringsAsFactors = FALSE)
df
df[with(df, ave(is.na(Value) | is.na(Value1), Name, FUN = any)), ]


 #  Name Value Value1 C1 C2 C3
 #1    A     1      2 NA NA NA
 #2    A    NA      2 NA  2 NA
 #3    A     1      2 NA  2 NA
 #4    A     1      2 NA  2 NA
 #5    A     1      2 NA  2 NA
 #6    B    NA      1 NA  2 NA
 #7    B    NA      2 NA  2 NA
 #8    B     1     NA NA  2 NA
 #9    B     1     NA NA  2 NA
library(dplyr)

df %>% group_by(Name) %>%
  filter_at(vars(starts_with("Value")), any_vars(is.na(.))) %>%  #Either Value or Value1 
  select(Name) %>% distinct()

# Name 
# <chr>
# 1 A    
# 2 B 
df %>% group_by(Name) %>%
  filter(any(is.na(Value) | any(is.na(Value1))))

  #   Name  Value Value1 C1       C2 C3   
  #  <chr> <int>  <int> <lgl> <int> <lgl>
  # 1 A         1      2 NA       NA NA   
  # 2 A        NA      2 NA        2 NA   
  # 3 A         1      2 NA        2 NA   
  # 4 A         1      2 NA        2 NA   
  # 5 A         1      2 NA        2 NA   
  # 6 B        NA      1 NA        2 NA   
  # 7 B        NA      2 NA        2 NA   
  # 8 B         1     NA NA        2 NA   
  # 9 B         1     NA NA        2 NA   
df <- read.table(text = 
"Name     Value   Value1  C1   C2    C3
A        1       2      NA   NA    NA
A        NA      2      NA   2     NA
A        1       2      NA   2     NA
A        1       2      NA   2     NA
A        1       2      NA   2     NA
B        NA      1      NA   2     NA
B        NA      2      NA   2     NA
B        1       NA     NA   2     NA
B        1       NA     NA   2     NA
C        1       5      NA   2     NA
C        1       5      NA   2     NA",
header = TRUE, stringsAsFactors = FALSE)