2017-05-27 61 views
1

我正在使用来自corrgram的棒球数据。我只用它的前6列。用名称替换值

sport = baseball[ , 1:6] 

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

我计算了其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。

回答

2

假设你的数据是这样的:

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

然后你可以使用ifelse方法:

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

你不需要'lappy'因为'ifelse'就已经返回矢量 – emilliman5

0

ifelse命令是ifelse一个量化的形式,这非常方便那类的东西。

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

在代码方面,你不需要环路内ordered电话,你应该利用别人的命令,因为如果命中不低于平均水平,那么它必须是上面(或等于)。

for (i in 1:nrow(sport)){ 
    if (sport[i,"Hits"] < average){ 
     sport[i,"Hits"] <- "below" 
    } else{ 
     sport[i,"Hits"] <- "above" 
    } 
} 
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