2016-09-15 39 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