我想提取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
你能帮我吗?我不知道我的工作中缺少什么。
我搜索了其他问题,但没有找到答案。
答案 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