根据列的值过滤行

时间:2018-12-05 08:59:55

标签: r dplyr subset

我想提取c1-c10列中至少具有一个值的行。 我有这样的数据(对于我的数据,共有11列计算日期和Q。日期和Q在所有行中都有值)。

 date c1   c2   c3   c4 ...  Q
 1   0.1  NA   NA   NA     300
 2   NA   0.2  1.3  NA     100
 3   NA   NA   NA   NA     200
 4   NA   0.3  NA   0.4    100
 5   NA   1.4  NA   NA     150
 6   NA   NA   NA   NA     200
 7   0.5  0.3   0.5   0.6  100

我想要这个

 date c1   c2   c3   c4 ...  Q
 1   0.1  NA   NA   NA     300
 2   NA   0.2  1.3  NA     100
 4   NA   0.3  NA   0.4    100
 5   NA   1.4  NA   NA     150
 7   0.5  0.3   0.5   0.6  100

我尝试过

 datawide2<- datawide1 %>% filter(rowSums(.[2:10]!="NULL")>=1)

但是结果只是在所有列c1-10中都具有所有值的行。 因此,在这种情况下,仅向我显示

 date c1   c2   c3   c4 ...  Q
 7   0.5  0.3   0.5   0.6  100

你能帮我吗?我不知道我的工作中缺少什么。

我搜索了其他问题,但没有找到答案。

2 个答案:

答案 0 :(得分:3)

@David Arenburg指出,您误解了NA和“ NULL”。您的数据框中有NA个,并且正在检查“ NULL”。如果这样做,您的代码就可以工作

#Again taking from David in comments
library(dplyr)
df %>% filter(rowSums(!is.na(.[2:5])) > 0) 

这也是使用filter_at

的一个好例子
df %>%
  filter_at(vars(c1:c4), any_vars(!is.na(.)))

#  date  c1  c2  c3  c4   Q
#1    1 0.1  NA  NA  NA 300
#2    2  NA 0.2 1.3  NA 100
#3    4  NA 0.3  NA 0.4 100
#4    5  NA 1.4  NA  NA 150
#5    7 0.5 0.3 0.5 0.6 100

我们还可以通过rowSums使用基数R找出至少存在一个非NA值的行。

cols <- 2:5 #Use this as index for columns for c1 to c10, here I have only till c4
df[rowSums(!is.na(df[cols])) > 0, ]


#  date  c1  c2  c3  c4   Q
#1    1 0.1  NA  NA  NA 300
#2    2  NA 0.2 1.3  NA 100
#4    4  NA 0.3  NA 0.4 100
#5    5  NA 1.4  NA  NA 150
#7    7 0.5 0.3 0.5 0.6 100

数据

df <- structure(list(date = 1:7, c1 = c(0.1, NA, NA, NA, NA, NA, 0.5
), c2 = c(NA, 0.2, NA, 0.3, 1.4, NA, 0.3), c3 = c(NA, 1.3, NA, 
NA, NA, NA, 0.5), c4 = c(NA, NA, NA, 0.4, NA, NA, 0.6), Q = c(300L, 
100L, 200L, 100L, 150L, 200L, 100L)), .Names = c("date", "c1", 
"c2", "c3", "c4", "Q"), class = "data.frame", row.names = c(NA, 
-7L))

答案 1 :(得分:1)

要了解发生了什么,您可以尝试

df %>% mutate(rowSums(.[2:5]!="NULL"))
date  c1  c2  c3  c4   Q rowSums(.[2:5] != "NULL")
1    1 0.1  NA  NA  NA 300                        NA
2    2  NA 0.2 1.3  NA 100                        NA
3    3  NA  NA  NA  NA 200                        NA
4    4  NA 0.3  NA 0.4 100                        NA
5    5  NA 1.4  NA  NA 150                        NA
6    6  NA  NA  NA  NA 200                        NA
7    7 0.5 0.3 0.5 0.6 100                         4

这将得到您想要的

df %>% filter(rowSums(.[2:5]!="NULL", na.rm = TRUE)>=1)
date  c1  c2  c3  c4   Q
1    1 0.1  NA  NA  NA 300
2    2  NA 0.2 1.3  NA 100
3    4  NA 0.3  NA 0.4 100
4    5  NA 1.4  NA  NA 150
5    7 0.5 0.3 0.5 0.6 100