2016-09-15 42 views
3

我想筛选基于映射表BSP2R滤光器表值

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 

过滤规则应该是一个表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 

: 对于每个在bsp2中该项目不是NA的扇区,应该删除该项目中来自相应扇区并具有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滴,如项2需要对于b。 5号线项目2不需要扇区3

没有放到我想到了所有部门在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,] 

即使我手动设置矢量,过滤结果不是我期望的。 如果有人有解决这个问题的想法,这将是伟大的。部分步骤也可以帮助我。

预先感谢您!

回答

0

一个非常类似的答案,上面,是只是在发布时完成它。

你可能要基于对来定义你的数据帧像这样

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

最后子集BSP1在那里你在bsp1m有NA和bsp2m

bsp3 <- bsp1[!bsp1$Company %in% bsp3m$Company[is.na(bsp3m$value) & !is.na(bsp3m$flag)],] 
+3

这与我的不一样......它和我的 – Sotos

+3

完全一样“*上面的一个非常相似的答案,在它发布时刚刚完成*”嗯,通常,当发生这种情况时它发生了很多),人们只是感叹,不发布,并从它是相似的或相同的另一种答案给予好评对方的回答... – Cath

+2

反正分开,通常这是最好的做出那样的评论(”刚刚完成时...“)在这里的评论。答案的主体应该主要直接回答这个问题。 – Frank

2

一种方法是melt两个数据帧,merge按行业和变量,并找出哪些公司NAvalue.xvalue.yNA,即

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