2015-06-03 30 views
1

我有一個數據幀,它看起來像如下:更換NA的和刪除列以高效的方式

# Code: 
m3 <- c(NA, -3, NA, NA, -3) 
m2 <- c(rep(NA, 5)) 
m1 <- c(rep(NA, 5)) 
Zero <- c(rep(NA, 5)) 
p1 <- c(1, NA, NA, 1, NA) 
p2 <- c(NA, NA, NA, 2, NA) 
p3 <- c(3, NA, 3, 3, NA) 
df <- data.frame(m3, m2, m1, Zero, p1, p2, p3) 

# Output: 
    m3 m2 m1 Zero p1 p2 p3 
1 NA NA NA NA 1 NA 3 
2 -3 NA NA NA NA NA NA 
3 NA NA NA NA NA NA 3 
4 NA NA NA NA 1 2 3 
5 -3 NA NA NA NA NA NA 

我需要插入-3整行中,如果有一個-3的第一列。我還需要刪除所有列,但是p1,p2和p3。最終結果應如下所示:

# Final output: 
    p1 p2 p3 
1 1 NA 3 
2 -3 -3 -3 
3 NA NA 3 
4 1 2 3 
5 -3 -3 -3 

我找到了一個解決方案,但對我來說似乎效率很低。我需要多次執行此操作,因此需要一個儘可能高效的代碼。我的低效解決方案如下所示:

# Inefficient code: 
for(i in 1:length(df$m3)){ 
    if(is.na(df$m3[i]) == FALSE){ 
    df[i, ] <- -3 
    } 
} 
df <- df[ , 5:length(df)] 

有沒有更高效的方法?非常感謝您提前!

+0

這是一個'dplyr'版本的IE'庫(dplyr); df%>%mutate_each(funs(replace(。,which(m3 == - 3),-3)),starts_with('p'))%>%select(p1:p3)' – akrun

回答

3

更新值:

df[df$m3 %in% -3,] <- -3 

選擇列:

df <- df[, c("p1", "p2", "p3")] 
+0

非常感謝!兩個答案都很好用! – JSP

2

您可以使用data.table

dt <- data.table(df) 
dt[m3 == -3, paste0('p', 1:3) := -3] 
dt <- dt[, c("p1", "p2", "p3"), with = FALSE] 
+3

這可以通過單行'setDT(d f)[m3 == - 3,names(df)[5:7]:= -3] [,1:4:= NULL]'或者可以使用'paste0('p',1:3):= ' – akrun

+0

謝謝,剛剛修改! –

+0

通過引用刪除列可以用':= NULL'完成,而'<--'複製可能有點低效。不知道你是否錯過了akrun的評論的一部分。 – Frank