Создание подмножества данных о пропущенных значениях из двух столбцов - PullRequest
0 голосов
/ 11 июля 2019

У меня есть набор данных, который содержит имена людей и их телефонные номера, Tel_1 и Tel_2. Некоторые из этих телефонных номеров не имеют ввода, а некоторые заполнены 0 или 00000

|-------|:-------:|-------:|
| Tom   |  87669  |        |
| Dave  |    0    |        |
| Jess  |    0    | 767589 |
| Mike  | 5673254 | 755995 |
| Jerry |         | 43789  |
| Yen   |         |        |
| Mary  | 34545   |        |

Я хочу вывод двумя способами, где один будет генерировать записи, содержащие ноль или пропущенные значения из любого из телефонных номеров, как показано ниже:

| Name  | Tel_1 |  Tel_2 |
|-------|:-----:|-------:|
| Tom   | 87669 |        |
| Dave  |   0   |        |
| Jess  |   0   | 767589 |
| Jerry |       | 43789  |
| Yen   |       |        |
| Mary  | 34545 |        |

Другой генерирует записи, содержащие 0 или пропущенные значения из обоих телефонных номеров, как показано ниже:

| Name | Tel_1 | Tel_2 |
|-----:|-------|-------|
| Dave | 0     |       |
| Yen  |       |       |

Ответы [ 3 ]

1 голос
/ 11 июля 2019

Предположим, ваша таблица хранится в dt. Я рекомендую использовать data.table для этого, так как нарезка более интуитивна (и намного быстрее), чем tidyverse.

Перво-наперво:

library(data.table)
dt <- as.data.table(dt)

Для генерации таблицы 1:

dt1 <- dt[is.na(Tel_1) | Tel_1 == 0 | is.na(Tel_2) | Tel_2 == 0]

Таблица 2:

dt2 <- dt[(Tel_1 == 0 | is.na(Tel_1)) & (Tel_2 == 0 | is.na(Tel_2))]

Если проблема в эффективности, вы можете сделать следующее:

dt[is.na(dt)] <- 0 # Replace all NAs with a zero.
dt1 <- dt[Tel_1 == 0 | Tel_2 == 0]
dt2 <- dt[Tel_1 == 0 & Tel_2 == 0]

Делая это, вы можете сделать то же самое с меньшим количеством кода и меньшим количеством логических операторов.

1 голос
/ 11 июля 2019
library(dplyr)

# First one
data %>% filter(is.na(Tel_1) | is.na(Tel_2) | Tel_1 == 0 | Tel_2 == 0)  

# Second One
data %>% filter((is.na(Tel_1) | Tel_1 == 0) & (is.na(Tel_2) | Tel_2 == 0))
0 голосов
/ 11 июля 2019

Если Tel1 и Tel2 действительно символы (а не факторы, какими они могут быть, если они есть в data.frame), вы ищете что-то вроде

mat <- as.martix[df,c("Tel1", "Tel2")]
rowHasZeros <- is.na(mat) | (nchar(mat) > 0) | (mat == "0")
idx1 <- rowSums(rowHasZeros) > 0
version1 <- Df[idx1,]

idx2 <- rowSums(rowHasZeros) == 2
version2 <- Df[idx2,]

I данные числовые

mat <- as.martix[df,c("Tel1", "Tel2")]
rowHasZeros <- is.na(mat) | (mat == 0)
idx1 <- rowSums(rowHasZeros) > 0
version1 <- Df[idx1,]

idx2 <- rowSums(rowHasZeros) == 2
version2 <- Df[idx2,]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...