我正在使用来自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。
答案 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
命令是if
和else
的矢量化形式,对于此类事情非常方便。
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"
}
}