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