从两列创建缺失值的数据子集

时间:2019-07-11 18:11:43

标签: r subset na missing-data

我有一个数据集,其中包含个人名称及其电话号码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 个答案:

答案 0 :(得分:1)

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))

答案 1 :(得分:1)

假设您的表存储在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]

这样做,您可以用更少的代码和更少的逻辑运算符来完成相同的工作。

答案 2 :(得分:0)

如果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,]

我的数据是数字

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,]