Как я могу удалить строку с нулевыми значениями в определенных столбцах? - PullRequest
0 голосов
/ 22 декабря 2018

Предположим, что мой фрейм данных выглядит так:

col1    col2    col3    col4    col5    col6    col7
------------------------------------------------------
  0       0       0       0     16,75   17,50   18,08
 18      24      24      24     19,83   20,47    0,00
 18      24      24      24      0,00   21,17   20,73
  0      22       0       0     18,67   18,90   21,23
 18      24      24      24      0,00   20,42   21,17
 18      24      24      24     20,52   21,17   21,92

Я хочу удалить строки, когда столбцы col5, col6 и col7 содержат 0. В конце форма фрейма данныхдолжно быть так:

col1    col2    col3    col4    col5    col6    col7
-----------------------------------------------------
  0      22       0       0     18,67   18,90   21,23
 18      24      24      24     20,52   21,17   21,92

Ответы [ 3 ]

0 голосов
/ 22 декабря 2018

Базовое решение R:

Саппли находит записи, которые не равны 0, применительно к нему проверяет, содержит ли вся строка только значения ИСТИНА и те, которые мы выбираем в data.frame.

df1[apply(sapply(df1[, 5:7], function(x) x != 0), 1, all), ]

  col1 col2 col3 col4  col5  col6  col7
1    0    0    0    0 16.75 17.50 18.08
4    0   22    0    0 18.67 18.90 21.23
6   18   24   24   24 20.52 21.17 21.92

Данные (я читаю ваши данные с dec = ",", поэтому все данные читаются как числа):

df1 <- structure(list(col1 = c(0L, 18L, 18L, 0L, 18L, 18L), col2 = c(0L, 
24L, 24L, 22L, 24L, 24L), col3 = c(0L, 24L, 24L, 0L, 24L, 24L
), col4 = c(0L, 24L, 24L, 0L, 24L, 24L), col5 = c(16.75, 19.83, 
0, 18.67, 0, 20.52), col6 = c(17.5, 20.47, 21.17, 18.9, 20.42, 
21.17), col7 = c(18.08, 0, 20.73, 21.23, 21.17, 21.92)), class = "data.frame", row.names = c(NA, 
-6L))
0 голосов
/ 22 декабря 2018

Базовый метод R, который вычитает соответствующие столбцы из данных и проверяет их на нули.Это не использует никаких циклов.

df[rowSums(df[c("col5", "col6", "col7")] == 0) == 0,]
#   col1 col2 col3 col4  col5  col6  col7
# 1    0    0    0    0 16.75 17.50 18.08
# 4    0   22    0    0 18.67 18.90 21.23
# 6   18   24   24   24 20.52 21.17 21.92

Я также считал данные с dec="," (мне показалось логичным)

df <- read.table(text="col1    col2    col3    col4    col5    col6    col7
0   0   0   0   16,75   17,50   18,08
18  24  24  24  19,83   20,47   0,00
18  24  24  24  0,00    21,17   20,73
0   22  0   0   18,67   18,90   21,23
18  24  24  24  0,00    20,42   21,17
18  24  24  24  20,52   21,17   21,92", header=TRUE, dec=",")
0 голосов
/ 22 декабря 2018

Мы можем использовать filter_at

library(tidyverse)
df1 %>% 
   filter_at(vars(col5, col6, col7), all_vars(. != '0,00'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...