修改数据帧的行(purrr)

问题描述 投票:0回答:1

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
r loops dataframe purrr
1个回答
0
投票
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", "", "", "", "", ""))

0
投票

虽然这种逻辑并不是真正可以扩展的,但是您可以一口气做到这一点:

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     
© www.soinside.com 2019 - 2024. All rights reserved.