如何根据dplyr中的值过滤列?

pac*_*ese 1 r dplyr

我要删除最后一个值为零的所有行以及所有最后一个值为零的列。

这是我的数据集的一个虚拟(可复制)示例:

library(dplyr)

x = c("apples" ,1,0,1,2)
y = c("bananas",0,0,0,0)
z = c("apples" ,2,0,4,6)
t = c("rowsum" ,3,0,5,8)

my_table = rbind(x,y,z,t)
colnames(my_table) = c("product","day1","day2","day3","colsum")

my_table = as.tbl(as.data.frame(my_table)) %>% 
  mutate(day1 = as.integer(as.character(day1)),
         day2 = as.integer(as.character(day2)),
         day3 = as.integer(as.character(day3)),
         colsum = as.integer(as.character(colsum)))
Run Code Online (Sandbox Code Playgroud)

虚拟示例具有以下输出:

> my_table
# A tibble: 4 × 5
  product  day1  day2  day3 colsum
   <fctr> <int> <int> <int>  <int>
1  apples     1     0     1      2
2 bananas     0     0     0      0
3  apples     2     0     4      6
4  rowsum     3     0     5      8
Run Code Online (Sandbox Code Playgroud)

现在,我删除最终值为零的行:

my_table = my_table %>% 
  filter(colsum > 0)

> my_table
# A tibble: 3 × 5
  product  day1  day2  day3 colsum
   <fctr> <int> <int> <int>  <int>
1  apples     1     0     1      2
2  apples     2     0     4      6
3  rowsum     3     0     5      8
Run Code Online (Sandbox Code Playgroud)

问题是:

如何根据中的值过滤列dplyr

我想做这样的事情:

# code that does NOT work
my_table = my_table %>% 
  filter(my_table[nrow(my_table)] > 0)
Run Code Online (Sandbox Code Playgroud)

获得:

> my_table
# A tibble: 3 × 5
  product  day1  day3 colsum
   <fctr> <int> <int>  <int>
1  apples     1     1      2
2  apples     2     4      6
3  rowsum     3     5      8
Run Code Online (Sandbox Code Playgroud)

更新:@Patronius的解决方案(与配合使用dplyr 0.5.0

my_table %>% 
  filter(colsum > 0) %>% 
  select_if(function(.) last(.) != 0)

# A tibble: 3 × 4
  product  day1  day3 colsum
   <fctr> <int> <int>  <int>
1  apples     1     1      2
2  apples     2     4      6
3  rowsum     3     5      8
Run Code Online (Sandbox Code Playgroud)

Dav*_*son 5

您可以使用dplyr select_iflast

my_table %>%
  select_if(function(.) last(.) != 0)
Run Code Online (Sandbox Code Playgroud)

请注意,它保留了因子列product(因为不正确,即product因子的最后一项为零)。