2016-07-26 3 views
0

私の配列を操作する必要があります。 私はすべての結果を含む配列の呼び出しresを持っています。 入力のすぐ下に表示されます。アレイ操作と名前によるデータの抽出

RT Max blk24 blk23 mat23 sm23 sm24 
1 1.6 261 13  19  19  27  20 
2 1.6 284 NA  53  5  99  91 
3 1.7 304 NA  NA  NA  81  NA 
4 1.8 305 32  28  28  39  33 
5 1.9 322 8  NA  NA  36  39 
6 1.9 349 NA  NA  NA  24  17 
7 2 389 1  3  NA  50  NA 
8 2.1 393 80  70  7  12  71 
9 2.1 622 NA  NA  15  97  96 
10 2.2 705 NA  NA  NA  NA  32 

は、私がここにblk、およびsmとそれ自体で価値の基準をしている列名に応じて自分のデータを抽出したいです。

blkのために私はそのように行うことを提案する:

whereblk<- grep("^Blk", colnames(res)) 

for (i in 1:length(res)){ 
    tmp.res<-res[which(res[whereblk]>0),] 
} 

私は私のすべてのRTMaxblk>0を与える出力を取得します。

次に、sm列から値を抽出したいと思います。 blk=NAmat=NAの場合、smの値を抽出したいと思います。

手がかりはありますか?

マイ所望の出力である:Excelを使用してそれを行うに

RT Max   sm23 sm24 
1 
2 
3 1.7 304   81  NA 
4 
5 
6 1.9 349   24  17 
7 
8 
9 
10 2.2 705   NA  32 

、それは続いて式を使用することが可能である、=(COUNTIF(BLK IF:BLK、 "> 0")、 " - "、 sm)。 Excelの問題は、たとえばblkの列数が変更された場合など、自動的には使用できません。

ここでの難しさは、列の位置を名前に従ってローカライズする式を使用することです。私はまだマスターではない何かである2つの基準に従って価値を抽出する。

ご意見がありましたら、大歓迎です。

+0

はdput 'の出力を追加します。 (res) 'を呼び出すことで、他の人が配列を再作成できるようにします。コマンド 'subset'も参照してください。 – TomNash

+0

正確に言うのは本当に難しいですが、 'nams < - grepl(" blk | mat "、names(res)); res [rowSums(is.na(res [nams]))== sum(nams)、] 'それは? – thelatemail

答えて

1

ここではdplyrソリューションです。

@thelatemailは、コメントセクションの基数Rだけで動作するソリューションを提供していると確信しています。ここで

library(dplyr) 

df <- read.table(text = "RT Max blk24 blk23 mat23 sm23 sm24 
    1 1.6 261 13  19  19  27  20 
    2 1.6 284 NA  53  5  99  91 
    3 1.7 304 NA  NA  NA  81  NA 
    4 1.8 305 32  28  28  39  33 
    5 1.9 322 8  NA  NA  36  39 
    6 1.9 349 NA  NA  NA  24  17 
    7 2 389 1  3  NA  50  NA 
    8 2.1 393 80  70  7  12  71 
    9 2.1 622 NA  NA  15  97  96 
    10 2.2 705 NA  NA  NA  NA  32", header = T) 

nams <- df %>% select(matches('blk|mat')) 
df <- df[apply(nams, 1, function(i) all(is.na(i)))==TRUE,] 

df 

    RT Max blk24 blk23 mat23 sm23 sm24 
3 1.7 304 NA NA NA 81 NA 
6 1.9 349 NA NA NA 24 17 
10 2.2 705 NA NA NA NA 32 
2

Reducelapplybase Rオプション(仮定は、我々がdata.frameを持っているか、他as.data.frame(m1)によりdata.frameに変換することである - それはmatrixの場合)である

nm1 <- grep("blk|mat", names(df), value = TRUE) 
df[Reduce(`&`,lapply(df[nm1], is.na)), setdiff(names(df), nm1)] 
# RT Max sm23 sm24 
#3 1.7 304 81 NA 
#6 1.9 349 24 17 
#10 2.2 705 NA 32 
+1

ありがとう私はReduce関数についていくつかのドキュメントを作っています。 – Vanbell

関連する問題