我有一个如下所示的数据框:
# 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 :(得分: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]