【问题标题】:Creating a subset of data of missing values from two columns从两列创建缺失值的数据子集
【发布时间】:2019-11-21 12:32:46
【问题描述】:

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

【问题讨论】:

  • & 用于| 用于。到目前为止,您尝试过什么,您在哪里卡住了?
  • @Gregor 由于数据集包含空白值,我不确定如何使用逻辑运算符。我能想到的一种方法是在 Tel1 和 Tel2 上分别使用 complete.cases,然后使用 join 函数。
  • 你是什么空白?它们是空字符串"" 吗?还是NA 值?我认为使用complete.cases 根本没有用...
  • @Gregor 它们缺少值并在 R 中表示为 NA。我的原始文件是 excel 表。

标签: r subset na missing-data


【解决方案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))

【讨论】:

  • 如果数据还包含 0000000000 和 0,我如何将它也包含在输出中?
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    通过这样做,您可以用更少的代码和更少的逻辑运算符来做同样的事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-27
      • 1970-01-01
      • 2015-11-14
      • 2019-08-25
      • 2021-11-09
      相关资源
      最近更新 更多