df示例:
dt <- tibble::tibble(V1 = c(rep("alpha", 2), "gamma", "theta", "zeta", "alpha", "beta", "gamma", "theta", "zeta"),
V2 = c("alpha", "gamma", "alpha", "beta", "theta", "gamma", rep("", 4)),
V3 = c("gamma", "theta", "zeta", "alpha", "beta", "gamma", "gamma", "", "", ""),
V4 = c(rep("gamma", 10)),
V5 = c("beta", "gamma", "alpha", "beta", "theta", "", "", "", "", ""))
dt <- data.table::transpose(dt)
dt
#> V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
#> 1 alpha alpha gamma theta zeta alpha beta gamma theta zeta
#> 2 alpha gamma alpha beta theta gamma
#> 3 gamma theta zeta alpha beta gamma gamma
#> 4 gamma gamma gamma gamma gamma gamma gamma gamma gamma gamma
#> 5 beta gamma alpha beta theta
我需要修改每一行,例如:如果一行中的最后一个值是“ gamma”,请将其修改为“”,直到另一个值,或者如果所有值都是“ gamma”,则将行保持原样。
所以,我想要的输出是:
#> V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
#> 1 alpha alpha gamma theta zeta alpha beta gamma theta zeta
#> 2 alpha gamma alpha beta theta
#> 3 gamma theta zeta alpha beta
#> 4 gamma gamma gamma gamma gamma gamma gamma gamma gamma gamma
#> 5 beta gamma alpha beta theta
dt[] <- lapply(
dt,
function(x) {
if (all(x == "gamma") | tail(x[x != ""], 1) != "gamma") {
x
} else {
last_ng <- max(which( !x %in% c("gamma", "")))
x[-c(1:last_ng)] <- ""
x
}
}
)
data.table::transpose(dt)
# V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
# 1 alpha alpha gamma theta zeta alpha beta gamma theta zeta
# 2 alpha gamma alpha beta theta
# 3 gamma theta zeta alpha beta
# 4 gamma gamma gamma gamma gamma gamma gamma gamma gamma gamma
# 5 beta gamma alpha beta theta
数据
dt <- tibble::tibble(V1 = c(rep("alpha", 2), "gamma", "theta", "zeta", "alpha", "beta", "gamma", "theta", "zeta"),
V2 = c("alpha", "gamma", "alpha", "beta", "theta", "gamma", rep("", 4)),
V3 = c("gamma", "theta", "zeta", "alpha", "beta", "gamma", "gamma", "", "", ""),
V4 = c(rep("gamma", 10)),
V5 = c("beta", "gamma", "alpha", "beta", "theta", "", "", "", "", ""))
虽然这种逻辑并不是真正可以扩展的,但是您可以一口气做到这一点:
dt[col(dt) > max.col(dt != "gamma" & dt != "", ties="last")] <- ""
dt
# V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
#1 alpha alpha gamma theta zeta alpha beta gamma theta zeta
#2 alpha gamma alpha beta theta
#3 gamma theta zeta alpha beta
#4 gamma gamma gamma gamma gamma gamma gamma gamma gamma gamma
#5 beta gamma alpha beta theta