2017-06-01 99 views
2

在r中,我試圖找出如何找到哪些區域包含在A,B,C,D等中。例如,A包含540,300,330。雖然C包含區域330.從數據創建R矢量

我想這些保存到一個載體中,從而像A = [540300330]和C = [300],和d = [540,330]

數據:

Area A B C D 
540  Y   Y  
300  Y  Y 
330  Y   Y 

我正在考慮使用summaryBy聲明。但是這並沒有給我想要的結果。

summaryBy(Area ~ A, FUN=(length)) 

回答

3

你可以得到一個list()對象包含要通過什麼:

lapply(dat[c("A","B","C","D")], function(x) dat$Area[x=="Y"]) 
#$A 
#[1] 540 300 330 
# 
#$B 
#integer(0) 
# 
#$C 
#[1] 300 
# 
#$D 
#[1] 540 330 

這裏幾乎沒有理由來填充分開AB等變量。

如果你想要一個'tidy'2列數據框的值和索引,你可以在stack(...)中包裝上面的代碼。

+0

如何輸入:'DAT [-1]'? – Parfait

+0

@Parfait - 當然,如果你願意。 – thelatemail

1

使用tidyverse較爲複雜:

dat %>% 
    gather(k,v,-Area) %>% 
    filter(v=="Y") %>% 
    nest(Area) %>% 
    as.data.frame 

    k   data 
1 A 540, 300, 330 
2 C   300 
3 D  540, 330 

Butif你有NA s,而不是空字符串,它幾乎是優雅:

df[df==""] <- NA 

df %>% 
    gather(k, v, -Area, na.rm=TRUE) %>% 
    nest(Area) 
0

下面是使用選項data.table

library(data.table) 
dM <- melt(setDT(dat), id.var = "Area")[value == "Y"] 
split(dM$Area, dM$variable) 
#$A 
#[1] 540 300 330 

#$B 
#integer(0) 

#$C 
#[1] 300 

#$D 
#[1] 540 330 

如果我們需要一個data.frame或矩陣輸出

`dim<-`(dat$Area[row(dat[-1]) *NA^(dat[-1]!="Y")], dim(dat[-1])) 
#  [,1] [,2] [,3] [,4] 
#[1,] 540 NA NA 540 
#[2,] 300 NA 300 NA 
#[3,] 330 NA NA 330