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
列中至少得到1NA
但是,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)