R 过滤器 table 与映射 table 以减少 NA 值
R filter table with mapping table to reduce NA values
我想过滤一个table bsp1
g <- factor(c("Company 1", "Company 2", "Company 3", "Company 4", "Company 5"))
w <- factor(c("a", "b", "c", "a", "c"))
x <- c(28, 18, 25, NA, 21)
y <- c(80, NA, 74, 101, NA)
z <- c(170, 174, 183, NA, 185)
bsp1 <- data.frame(g, w, x, y, z)
colnames(bsp1) <- c("Company", "Sector", "Item 1", "Item 2", "Item 3")
rm(w, x, y, z)
bsp1
# Company Sector Item 1 Item 2 Item 3
# 1 Company 1 a 28 80 170
# 2 Company 2 b 18 NA 174
# 3 Company 3 c 25 74 183
# 4 Company 4 a NA 101 NA
# 5 Company 5 c 21 NA 185
基于映射 table bsp2
sector <- factor(c("a", "b", "c"))
a <- c(1, 1, 1)
b <- c(NA, 1, NA)
c <- c(NA, NA, 1)
bsp2 <- data.frame(sector, a, b, c)
colnames(bsp2) <- c("Sector", "Item 1", "Item 2", "Item 3")
bsp2
# Sector Item 1 Item 2 Item 3
# 1 a 1 NA NA
# 2 b 1 1 NA
# 3 c 1 NA 1
过滤规则应该是:
对于项目不是 NA 的 bsp2 中的每个扇区,应删除项目中具有 NA 的相应扇区的 bsp1 中的行。
因此,期望的结果看起来像 bsp3
bsp3 <- bsp1[c(1, 3, 5),]
bsp3
# Company Sector Item 1 Item 2 Item 3
# 1 Company 1 a 28 80 170
# 3 Company 3 c 25 74 183
# 5 Company 5 c 21 NA 185
公司 2 已删除,因为 b 需要项目 2。第 5 行未删除,因为扇区 3 不需要第 2 项。
我想到了一个针对 bsp1 上所有扇区的应用函数,其中包含一个相关列的向量,该向量使用以下向量函数导出。
a <- !is.na(bsp2[1,])
a <- which(a==c("TRUE"))
不幸的是,在一个向量的过滤测试中,我遇到了一个问题,即 b 被解释为矩阵。
b <- is.na(bsp1[, a])
c <- which(b==c("TRUE"))
reduced2016b <- data2013[-c,]
即使我手动设置了矢量,过滤结果也不是我期望的那样。
如果有人有解决这个问题的想法,那就太好了。部分步骤也对我有帮助。
提前致谢!
一种方法是 melt
两个数据框,merge
按部门和变量,并找出哪些公司有 NA
value.x
而不是 NA
对于 value.y
,即
library(reshape2)
new_df <- merge(melt(bsp1), melt(bsp2), by = c('Sector', 'variable'))
ind <- as.character(new_df$Company[is.na(new_df$value.x) & !is.na(new_df$value.y)])
bsp1[!bsp1$Company %in% ind,]
# Company Sector Item 1 Item 2 Item 3
#1 Company 1 a 28 80 170
#3 Company 3 c 25 74 183
#5 Company 5 c 21 NA 185
一个与上面非常相似的答案,在发布时刚刚完成。
您可能想像这样定义数据框
bsp1 <- data.frame(Company=factor(c("Company 1", "Company 2", "Company 3", "Company 4", "Company 5")),
Sector=factor(c("a", "b", "c", "a", "c")),
Item1=c(28, 18, 25, NA, 21),
Item2=c(80, NA, 74, 101, NA),
Item3= c(170, 174, 183, NA, 185))
和
bsp2 <- data.frame(Sector=factor(c("a", "b", "c")),
Item1=c(1, 1, 1),
Item2=c(NA, 1, NA),
Item3=c(NA, NA, 1))
然后熔化并合并 bsp1 和 bsp2
bsp1m <- melt(bsp1,id.vars=c("Company","Sector"))
bsp2m <- melt(bsp2,id.vars="Sector", value.name = "flag")
bsp3m <- merge(bsp1m,bsp2m,by=c("Sector","variable"))
最后根据 bsp1m 中的 NA 和 bsp2m 中的 1 的位置对 bsp1 进行子集
bsp3 <- bsp1[!bsp1$Company %in% bsp3m$Company[is.na(bsp3m$value) & !is.na(bsp3m$flag)],]
我想过滤一个table bsp1
g <- factor(c("Company 1", "Company 2", "Company 3", "Company 4", "Company 5"))
w <- factor(c("a", "b", "c", "a", "c"))
x <- c(28, 18, 25, NA, 21)
y <- c(80, NA, 74, 101, NA)
z <- c(170, 174, 183, NA, 185)
bsp1 <- data.frame(g, w, x, y, z)
colnames(bsp1) <- c("Company", "Sector", "Item 1", "Item 2", "Item 3")
rm(w, x, y, z)
bsp1
# Company Sector Item 1 Item 2 Item 3
# 1 Company 1 a 28 80 170
# 2 Company 2 b 18 NA 174
# 3 Company 3 c 25 74 183
# 4 Company 4 a NA 101 NA
# 5 Company 5 c 21 NA 185
基于映射 table bsp2
sector <- factor(c("a", "b", "c"))
a <- c(1, 1, 1)
b <- c(NA, 1, NA)
c <- c(NA, NA, 1)
bsp2 <- data.frame(sector, a, b, c)
colnames(bsp2) <- c("Sector", "Item 1", "Item 2", "Item 3")
bsp2
# Sector Item 1 Item 2 Item 3
# 1 a 1 NA NA
# 2 b 1 1 NA
# 3 c 1 NA 1
过滤规则应该是: 对于项目不是 NA 的 bsp2 中的每个扇区,应删除项目中具有 NA 的相应扇区的 bsp1 中的行。
因此,期望的结果看起来像 bsp3
bsp3 <- bsp1[c(1, 3, 5),]
bsp3
# Company Sector Item 1 Item 2 Item 3
# 1 Company 1 a 28 80 170
# 3 Company 3 c 25 74 183
# 5 Company 5 c 21 NA 185
公司 2 已删除,因为 b 需要项目 2。第 5 行未删除,因为扇区 3 不需要第 2 项。
我想到了一个针对 bsp1 上所有扇区的应用函数,其中包含一个相关列的向量,该向量使用以下向量函数导出。
a <- !is.na(bsp2[1,])
a <- which(a==c("TRUE"))
不幸的是,在一个向量的过滤测试中,我遇到了一个问题,即 b 被解释为矩阵。
b <- is.na(bsp1[, a])
c <- which(b==c("TRUE"))
reduced2016b <- data2013[-c,]
即使我手动设置了矢量,过滤结果也不是我期望的那样。 如果有人有解决这个问题的想法,那就太好了。部分步骤也对我有帮助。
提前致谢!
一种方法是 melt
两个数据框,merge
按部门和变量,并找出哪些公司有 NA
value.x
而不是 NA
对于 value.y
,即
library(reshape2)
new_df <- merge(melt(bsp1), melt(bsp2), by = c('Sector', 'variable'))
ind <- as.character(new_df$Company[is.na(new_df$value.x) & !is.na(new_df$value.y)])
bsp1[!bsp1$Company %in% ind,]
# Company Sector Item 1 Item 2 Item 3
#1 Company 1 a 28 80 170
#3 Company 3 c 25 74 183
#5 Company 5 c 21 NA 185
一个与上面非常相似的答案,在发布时刚刚完成。
您可能想像这样定义数据框
bsp1 <- data.frame(Company=factor(c("Company 1", "Company 2", "Company 3", "Company 4", "Company 5")),
Sector=factor(c("a", "b", "c", "a", "c")),
Item1=c(28, 18, 25, NA, 21),
Item2=c(80, NA, 74, 101, NA),
Item3= c(170, 174, 183, NA, 185))
和
bsp2 <- data.frame(Sector=factor(c("a", "b", "c")),
Item1=c(1, 1, 1),
Item2=c(NA, 1, NA),
Item3=c(NA, NA, 1))
然后熔化并合并 bsp1 和 bsp2
bsp1m <- melt(bsp1,id.vars=c("Company","Sector"))
bsp2m <- melt(bsp2,id.vars="Sector", value.name = "flag")
bsp3m <- merge(bsp1m,bsp2m,by=c("Sector","variable"))
最后根据 bsp1m 中的 NA 和 bsp2m 中的 1 的位置对 bsp1 进行子集
bsp3 <- bsp1[!bsp1$Company %in% bsp3m$Company[is.na(bsp3m$value) & !is.na(bsp3m$flag)],]