2017-06-01 104 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