2013-07-15 26 views
0

值我有一個數據幀像這樣:R:有條件取代環

rel  <- c(2, 5, NA, 3, 6) 
year.in <- c(4, NA, 2, 3, 2) 
year.out <- c(6, 7, NA, 5, 4) 
year.1 <- c(NA, NA, NA, NA, NA) 
year.2 <- c(NA, NA, NA, NA, NA) 
year.3 <- c(NA, NA, NA, NA, NA) 
year.4 <- c(NA, NA, NA, NA, NA) 
year.5 <- c(NA, NA, NA, NA, NA) 

df <- as.data.frame(cbind(rel, year.in, year.out, year.1, year.2, year.3, 
         year.4, year.5)) 

我想要做的是更新的year.1缺失值 - 一倍。5以「相對」的價值,但只有:(year.in> = year.i AND year.out < = year.i)(i是1:5)

關注進入年份,我想出了這個:

for (i in 1:5) ifelse(df$year.in < i, 
    df[paste("year", i, sep= ".")]<- NA, 
    df[paste("year", i, sep= ".")]<- df["rel"]) 

但是,這僅僅取代所有year.i變量的值爲rel。

我有兩個問題:

  • 我怎麼能與中提到的條件的「相對」值更新year.i變量?

  • 在這裏使用if else語句不好嗎?

最佳和在此先感謝,

理查德

回答

4
library(data.table) 
dt = data.table(df) 

for(i in 1:5) dt[year.in <= i & i <= year.out, paste0('year.', i) := rel] 

dt 
# rel year.in year.out year.1 year.2 year.3 year.4 year.5 
#1: 2  4  6  NA  NA  NA  2  2 
#2: 5  NA  7  NA  NA  NA  NA  NA 
#3: NA  2  NA  NA  NA  NA  NA  NA 
#4: 3  3  5  NA  NA  3  3  3 
#5: 6  2  4  NA  6  6  6  NA 
+0

謝謝,這有很大的幫助,我會確保更深入地學習data.table包! – Richard

1

我最好使用reshape2melt數據:

library(reshape2)  
df.melt <- melt(df, id.vars=c('rel', 'year.in', 'year.out')) 

挖出數字年:

df.melt$year <- as.integer(gsub('year\\.', '', df.melt$variable)) 

然後使用矢量操作:

subsetter <- with(df.melt, year.in >= year & year.out <= year.out) 
subsetter[is.na(subsetter)] <- FALSE 
df.melt$value[subsetter] <- df.melt$rel[subsetter] 

然而,在你的榜樣,這些都失敗的情況。

使用ifelse是完全可以接受的,但是,不要在裏面進行賦值。而是將其結果分配給某些內容,如下所示。問題在於你在ifelse內執行的兩項任務不在每個子集上,而是像在獨立運行一樣。

for (i in 1:5) { 
    year_col <- paste('year', i, sep='.') 
    df[[year_col]] <- ifelse(df$year.in >= i & df$year.out <= i, 
         df$rel, 
         df[[year_col]]) 
} 

爲了回答你的子彈:

  • 見上面。

  • 使用ifelse沒有什麼特別的錯誤,有時爲了便於閱讀,這樣做很方便。但是,它是一個「循環」構造,因此通常可以用更高效的矢量化解決方案來取代。

+0

親愛的賈斯汀,感謝你明確地解決我的問題。我很抱歉地說,我在運行代碼時遇到了困難。第一段代碼工作正常,但不提供預期的輸出。例如在year.in == 4和year.out == 6中值爲2。for循環在我的情況下會產生警告:警告消息:「在[< - 。data。('* tmp *',year_col,value = list(c)(NA_real_,: 提供了5個變量來代替1個變量「 – Richard

+1

感謝您的提示,我的錯誤,意外的輸出是因爲您的條件反向寫入你的問題,但是,這個警告是無意的,可以通過'[[''通過'year_col'來索引'df'來修復(參見我的編輯) – Justin

+0

感謝您回覆此問。是的,我在條件語句中不一致:[ – Richard