替换NA'并以有效的方式删除列

时间:2015-06-03 17:00:33

标签: r performance dataframe

我有一个如下所示的数据框:

# 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)]

有更有效的方法吗?非常感谢你提前!

2 个答案:

答案 0 :(得分:3)

更新值:

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

选择列:

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

答案 1 :(得分:2)

您可以使用data.table

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