2017-06-12 30 views
0

ブランクレベルの因子の名前を割り当てようとしていますlepsp部分集合内の値一致に条件付きです。データの例が含まれています:lepspが空白ですが、lepcnを持っており、lepcnマッチ同じplantfamにフィードを別のlepspという場合は、データフレームのサブセット内の値一致で条件一致の条件付きレベルの名前を変更します

df<-data.frame(plantfam= c("Asteraceae","Asteraceae","Asteraceae", 
"Melastomaceae","Poaceae","Poaceae","Poaceae","Poaceae"), lepfam= 
c("Geometridae", "Erebidae","Erebidae", 
"Noctuidae","Erebidae","Erebidae","Erebidae",""), lepsp= c("Eois sp", 
"Anoba sp", "", "Balsinae sp", "Deinopa sp", "", "Cocytia sp", ""), 
lepcn= c("green/spikes","green/nospikes", "green/nospikes","", 
"black/orangespots", "black/orangespots", "black/yellowspots", 
"black/yellowspots")) 

df<- 
    plantfam  lepfam   lepsp    lepcn 
    Asteraceae  Geometridae Eois sp   green/spikes 
    Asteraceae  Erebidae  Anoba sp   green/nospikes      
    Asteraceae  Erebidae       green/nospikes    
    Melastomaceae Noctuidae  Balsinae sp    
    Poaceae   Erebidae  Deinopa sp   black/orangespots 
    Poaceae   Erebidae       black/orangespots 
    Poaceae   Erebidae  Cocytia sp   black/yellowspots 
    Poaceae           black/yellowspots 

はここで、次のデータフレームのためのコードですブランクlepspには、これらの条件が一致する名前lepspが与えられます。従って、同じlepcnを有するplantfamをそれぞれ供給するlepfamサブセットは、同じ名前で示される。組み合わせを検査する利点を有する

https://stackoverflow.com/a/44479195/8061255
+0

再現可能なソリューションを作成できるように、データセットのサンプルを提供できますか? –

+0

私は上記のデータセットの一例であるという印象を受けています。さらに助けることができるものは何ですか?あなたの時間をありがとう。 – Danielle

+0

私は、あなたが要求しているかもしれないサンプルデータフレームのコードを追加しました。あなたの助けをもう一度ありがとう。 – Danielle

答えて

0

わかりやすい基地Rは、名前を変更する:

output<- 
    plantfam  lepfam   lepsp    lepcn 
    Asteraceae  Geometridae Eois sp   green/spikes 
    Asteraceae  Erebidae  Anoba sp   green/nospikes      
    Asteraceae  Erebidae  Anoba sp   green/nospikes    
    Melastomaceae Noctuidae  Balsinae sp    
    Poaceae   Erebidae  Deinopa sp  black/orangespots 
    Poaceae   Erebidae  Deinopa sp  black/orangespots 
    Poaceae   Erebidae  Cocytia sp  black/yellowspots 
    Poaceae      Cocytia sp  black/yellowspots 

私は成功せず、次のバリエーションを試みました。要するに、あなたはplantfam/lepfam/lepcn組み合わせのユニークなリストを取得し、あなたは、元のデータセットとそれをマージ:データ内

読むと、予想通りの書式があることを確認してください。

df<- read.csv(text = 
'plantfam,lepfam,lepsp,lepcn 
Asteraceae,Geometridae,Eois sp,green/spikes 
Asteraceae,Erebidae,Anoba sp,green/nospikes 
Asteraceae,Erebidae,NA,green/nospikes 
Melastomaceae,Noctuidae,Balsinae sp,NA 
Poaceae,Erebidae,Deinopa sp,black/orangespots 
Poaceae,Erebidae,NA,black/orangespots 
Poaceae,Erebidae,NA,balck/yellowspots') 

# assumes blanks are NA 
# if blanks are actually empty strings "" then turn those into NA's 

# make sure everything is a character, not a factor 
df <- as.data.frame(apply(df,2,as.character),stringsAsFactors = F) 

ソリューション:

# get a unique list of all combinations that don't have missing data 
dflookup <- unique(na.omit(df)) 

# inspect combinations to be renamed, there should be no duplicate plantfam/lepfam/lepcn combinations 
dflookup 

# use the lookup to merge in all known names 
newdf <- merge(df,dflookup,by = c('plantfam','lepfam','lepcn'),all.x = T,suffixes = c('old','new')) 

# use original lepsp when new lepsp is NA 
newdf$lepsp <- ifelse(is.na(newdf$lepspnew),newdf$lepspold,newdf$lepspnew) 

# remove unneeded columns 
newdf$lepspold <- newdf$lepspnew <- NULL 

# turn back into factors if desired 
newdf <- as.data.frame(apply(newdf,2,as.factor)) 
関連する問題