用名称替换值

时间:2017-05-27 18:07:57

标签: r

我正在使用来自corrgram的棒球数据。我只使用它的前6列。

sport = baseball[ , 1:6]

我想用名称替换值。如果棒球数据的Hits列中的值高于其平均值,我想将该值标记为"above",如果它低于其平均值,我想将其标记为"below"。< / p>

我计算了Hits列的平均值。

average = mean((sport)[ , "Hits"])

然后:

for (i in 1:dim(sport)[1]){
    if (sport[i, "Hits"] < average)
        sport[i, "Hits"] = ordered(sport[i, "Hits"], labels = c("below"))
    if (sport[i, "Hits"] > average)
        sport[i, "Hits"] = ordered(sport[i, "Hits"], labels = c("above"))
}

但是,我的代码不起作用,它在其列的所有行中都给出了1。

3 个答案:

答案 0 :(得分:2)

假设您的数据如下所示:

sport = c(1,2,3,4,5,6)
average = mean(sport)

然后您可以使用 ifelse 方法:

result = ifelse(sport<average, "bellow", "above")

答案 1 :(得分:1)

使用dplyr即可:


library(corrgram)
library(dplyr)

data("baseball")

baseball %>% 
  tibble::as_tibble() %>% # just for the nice printing
  select(1:6) %>% 
  mutate(hits_cat = if_else(Hits < mean(Hits, na.rm = TRUE), "below", "above"),
         hits_cat = ordered(hits_cat, levels = c("below", "above")))

#> # A tibble: 322 × 7
#>              Name League   Team Position Atbat  Hits hits_cat
#>            <fctr> <fctr> <fctr>   <fctr> <int> <int>    <ord>
#>  1 Andy Allanson       A    CLE       C    293    66    below
#>  2 Alan Ashby          N    HOU       C    315    81    below
#>  3 Alvin Davis         A    SEA       1B   479   130    above
#>  4 Andre Dawson        N    MON       OF   496   141    above
#>  5 A Galarraga         N    MON       1B   321    87    below
#>  6 A Griffin           A    OAK       SS   594   169    above
#>  7 Al Newman           N    MON       2B   185    37    below
#>  8 A Salazar           A    KC        SS   298    73    below
#>  9 Andres Thomas       N    ATL       SS   323    81    below
#> 10 A Thornton          A    CLE       DH   401    92    below
#> # ... with 312 more rows

答案 2 :(得分:0)

ifelse命令是ifelse的矢量化形式,对于此类事情非常方便。

ifelse(sport$Hits >= mean(sprt$Hits), "above","below")

就你的代码而言,你不需要在循环中进行ordered调用,你应该使用else命令,因为如果命中率不低于平均值那么它必须高于(或等于)到)。

for (i in 1:nrow(sport)){
    if (sport[i,"Hits"] < average){
        sport[i,"Hits"] <- "below"
    } else{
        sport[i,"Hits"] <- "above"
    }
}