2017-06-01 6 views
2

私はA、B、C、Dなどにどの領域が含まれているかを調べる方法を見つけようとしています。例えば、Aには540,300,330が含まれています。 330Rベクトルのデータからの作成

IはA = [540300330]とC = [300]のようにベクターにこれらを保存する、及びD = [540、330]

なるデータ:

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

私はsummaryBy Statementを使うことを考えていました。しかし、これは私に望ましい結果を与えません。

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 

BA別々などの変数を移入するためにほとんどない理由があります。

値とインデックスを持つ「整然とした」2列のデータフレームが必要な場合は、上記を「stack(...)」にラップすることができます。 tidyverseを使用して

+0

data.frameまたは行列出力が必要な場合: 'DAT [-1]'? – Parfait

+0

@パルフェット - あなたが好きなら、確かに。 – thelatemail

1

はより複雑である:あなたの代わりに空の文字列のNA秒を持っている

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、それはほとんどエレガントです:ここで

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 
を使用してオプションです。

我々は、入力として、およそどのよう

`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 
関連する問題