2013-12-20 100 views
0

我有這個數據框稱爲數據。在數據框中,我有幾列,爲了簡單起見,我會用天氣比喻來解釋這些列,它就像「weather_st_louis」,「weather_boston」,「weather_ny」...我想創建一個列「天氣」,它應該這樣做,「如果聖路易斯天氣存在,請使用此列,否則如果波士頓天氣存在,請使用此列,否則如果天氣存在,請使用此列,否則爲NONE」。我將多次使用這個邏輯,並且有很多列,所以需要一種方法來提高效率。 R的做法是什麼?構建高效的R過濾器

另外,側面的問題,是我想在這裏建立一個稱爲「過濾器」?

if(exists("data['w_stlouis']")) { 
    data['w'] <- data['w_stlouis'] 
} else if(exists("data['w_boston]")){ 
    data['w'] <- data['w_boston'] 
} else if(exists("data['w_ny']")){ 
    data['w'] <- data['w_ny'] 
} else {data['w'] <- NA} 
+0

於是就有永遠只能存在一個城市? – A5C1D2H2I1M1N2O1R2T1

+0

阿南達,所有的城市都存在,但我正在創建一個新的代理專欄,以獲得最「可靠」的城市。 – appleLover

+0

不幸的是,我現在沒有時間發佈答案,但是我會將「匹配」與城市名稱的字符向量結合使用,作爲替代方案。 – A5C1D2H2I1M1N2O1R2T1

回答

0

嘗試類似的東西:

example <- matrix(NA,ncol=5,nrow=5) 
colnames(example) <- c("weather_1","weather_2","weather_3","weather_4","weather_5") 
example[5,3] <- 1 
example[3,2] <- 1 
example[1,2] <- 1 
example[4,4] <- 1 
example[5,2] <- 1 



w <- apply(example,1,function(x){ 
    o <- which(!is.na(x))[1] 
    if (is.na(o)) r <- "NONE" 
    else r <- colnames(example)[o] 
    r 
}) 

w 

當你重複做任務,嘗試使用應用/ tapply/sapply功能

0

這裏是另一個posibility。我不確定這是否是您需要的,但它可能會給您另一種處理方法。

df <- data.frame(matrix(rnorm(100, 100, 20),ncol=5,nrow=5)) 
colnames(df) <- c("weather_1","weather_2","weather_3","weather_4","weather_5") 

library(reshape2) 
df <- melt(df) 
df[1:10,2] <- NA 

str(df) 

weather_levels <- levels(df$variable) 

df$case <- ifelse(is.na(df$value), 0, 1) 

這兩個輸出相同的結果

subset(df, df$case == 1) 
na.omit(df)