删除包含全0的行,但保留r中NA的行

6rqinv9w  于 2023-03-20  发布在  其他
关注(0)|答案(3)|浏览(140)

我有一个 Dataframe ,其中有包含NA值的数字列,并填充了一个字符列,例如
| 鞋子|第1季度_销售额|第2季度_销售额|第3季度_销售额|第4季度_销售额|
| - ------|- ------|- ------|- ------|- ------|
| 冬季系列|不适用|不适用|不适用|不适用|
| Boot |五十|二十五|无|一百|
| 培训师|四十|六十五|二百|一百|
| 乐福鞋|无|四十五|二十个|十个|
| 夏季系列|不适用|不适用|不适用|不适用|
| 培训师|五十|六五五|四百|无|
| 触发器|无|二十五|四十|无|
| 凉鞋|无|二百零五|四十五|二十五|
| 其他|不适用|不适用|不适用|不适用|
| 木屐|无|无|无|无|
我想尝试删除总和为0的数字列(例如,clogs),但保留NA列,第一个字符列保留在原处。
我尝试使用以下代码删除0行:
df[应用(df[,-1],1,函数(x)!全部(x==0)),]
但是,这导致数据框删除第一列的字符值,例如:
| 鞋子|第1季度_销售额|第2季度_销售额|第3季度_销售额|第4季度_销售额|
| - ------|- ------|- ------|- ------|- ------|
| 不适用|不适用|不适用|不适用|不适用|
| Boot |五十|二十五|无|一百|
| 培训师|四十|六十五|二百|一百|
| 乐福鞋|无|四十五|二十个|十个|
| 不适用|不适用|不适用|不适用|不适用|
| 培训师|五十|六五五|四百|无|
| 触发器|无|二十五|四十|无|
| 凉鞋|无|二百零五|四十五|二十五|
| 不适用|不适用|不适用|不适用|不适用|
下面是我想看到的(删除了“clogs”行的原始表,但字符列保持不变):
| 鞋子|第1季度_销售额|第2季度_销售额|第3季度_销售额|第4季度_销售额|
| - ------|- ------|- ------|- ------|- ------|
| 冬季系列|不适用|不适用|不适用|不适用|
| Boot |五十|二十五|无|一百|
| 培训师|四十|六十五|二百|一百|
| 乐福鞋|无|四十五|二十个|十个|
| 夏季系列|不适用|不适用|不适用|不适用|
| 培训师|五十|六五五|四百|无|
| 触发器|无|二十五|四十|无|
| 凉鞋|无|二百零五|四十五|二十五|
| 其他|不适用|不适用|不适用|不适用|

bvhaajcl

bvhaajcl1#

tmp=rowSums(df[,-1])
df[is.na(tmp) | tmp!=0,]

              Shoes q1_sales q2_sales q3_sales q4_sales
1 Winter Collection       NA       NA       NA       NA
2             Boots       50       25        0      100
3          Trainers       40       65      200      100
4           Loafers        0       45       20       10
5 Summer Collection       NA       NA       NA       NA
6          Trainers       50      655      400        0
7        Flip Flops        0       25       40        0
8           Sandals        0      205       45       25
9             Other       NA       NA       NA       NA
ghhkc1vu

ghhkc1vu2#

对于dplyr,您可以在filter()中使用if_allif_any

library(dplyr)

df %>%
  filter(!if_all(-Shoes, ~ .x == 0) | if_any(-Shoes, is.na))

#               Shoes q1_sales q2_sales q3_sales q4_sales
# 1 Winter_Collection       NA       NA       NA       NA
# 2             Boots       50       25        0      100
# 3          Trainers       40       65      200      100
# 4           Loafers        0       45       20       10
# 5 Summer_Collection       NA       NA       NA       NA
# 6          Trainers       50      655      400        0
# 7        Flip_Flops        0       25       40        0
# 8           Sandals        0      205       45       25
# 9             Other       NA       NA       NA       NA
数据
df <- structure(list(Shoes = c("Winter_Collection", "Boots", "Trainers", 
"Loafers", "Summer_Collection", "Trainers", "Flip_Flops", "Sandals", 
"Other", "Clogs"), q1_sales = c(NA, 50L, 40L, 0L, NA, 50L, 0L, 
0L, NA, 0L), q2_sales = c(NA, 25L, 65L, 45L, NA, 655L, 25L, 205L, NA, 0L),
q3_sales = c(NA, 0L, 200L, 20L, NA, 400L, 40L, 45L, NA, 0L),
q4_sales = c(NA, 100L, 100L, 10L, NA, 0L, 0L, 25L, NA, 0L)),
class = "data.frame", row.names = c(NA, -10L))
1tu0hz3e

1tu0hz3e3#

  • EDIT*:(跟随@DarrenTsai的宝贵评论)

tidyverse解决方案:

df %>%
  filter(!if_all(matches("^q"), ~ . == 0) | if_any(matches("^q"), is.na))

相关问题