2016-09-06 8 views
0

Предположим, у меня есть список (в формате TBL), как это:Как рассчитать проценты нескольких столбцов в списке tbl в R?

 Type.1 count averageTotal averageHP averageAttack averageDefense averageSpAtk averageSp..Def averageSpeed 
     (fctr) (int)  (dbl)  (dbl)   (dbl)   (dbl)  (dbl)   (dbl)  (dbl) 
1  Bug 69  378.9275 56.88406  70.97101  70.72464  53.86957  64.79710  61.68116 
2  Dark 31  445.7419 66.80645  88.38710  70.22581  74.64516  69.51613  76.16129 
3 Dragon 32  550.5312 83.31250  112.12500  86.37500  96.84375  88.84375  83.03125 
4 Electric 44  443.4091 59.79545  69.09091  66.29545  90.02273  73.70455  84.50000 
5  Fairy 17  413.1765 74.11765  61.52941  65.70588  78.52941  84.70588  48.58824 

Если я хочу, чтобы вычислить процент каждого столбца из averageTotal столбца (для каждой строки), как бы я продолжу?

В частности, мой желаемый результат будет выглядеть так:

 Type.1 count averageTotal averageHP averageAttack averageDefense averageSpAtk averageSp..Def averageSpeed 
     (fctr) (int)  (dbl)  (dbl)   (dbl)   (dbl)  (dbl)   (dbl)  (dbl) 
1  Bug 69  378.9275 15.02%  18.73%   18.73%  14.21%  17.11%  16.29% 

ответ

4

Вот простой метод в базовом R:

df[, 4:9] <- df[, 4:9]/df[[3]] 

который возвращает

df 
    Type.1 count averageTotal averageHP averageAttack averageDefense averageSpAtk averageSp..Def averageSpeed 
1  Bug 69  378.9275 0.1501186  0.1872944  0.1866443 0.1421633  0.1710013 0.1627783 
2  Dark 31  445.7419 0.1498770  0.1982921  0.1575481 0.1674627  0.1559560 0.1708641 
3 Dragon 32  550.5312 0.1513311  0.2036669  0.1568939 0.1759096  0.1613782 0.1508202 
4 Electric 44  443.4091 0.1348539  0.1558175  0.1495131 0.2030241  0.1662225 0.1905689 
5 Fairy 17  413.1765 0.1793850  0.1489180  0.1590262 0.1900626  0.2050114 0.1175968 

Числа указывают номера позиции столбца, поэтому третий столбец делит столбцы с четырех до девяти. Об этом сообщается в пропорциях, а не проценты, но вы можете исправить это довольно легко с

df[, 4:9] <- round(100 * df[, 4:9]/df[[3]], 2) 

данных

df <- read.table(header=TRUE, text="  Type.1 count averageTotal averageHP averageAttack averageDefense averageSpAtk averageSp..Def averageSpeed 
       1  Bug 69  378.9275 56.88406  70.97101  70.72464  53.86957  64.79710  61.68116 
       2  Dark 31  445.7419 66.80645  88.38710  70.22581  74.64516  69.51613  76.16129 
       3 Dragon 32  550.5312 83.31250  112.12500  86.37500  96.84375  88.84375  83.03125 
       4 Electric 44  443.4091 59.79545  69.09091  66.29545  90.02273  73.70455  84.50000 
       5  Fairy 17  413.1765 74.11765  61.52941  65.70588  78.52941  84.70588  48.58824") 
+0

Спасибо! Это действительно очень просто и элегантно! –

1

С dplyr, вы можете использовать mutate_at, чтобы указать, какие столбцы изменить, с пользовательская функция, определенная в funs, где . представляет собой мутантную колонку:

df %>% mutate_at(vars(averageHP:averageSpeed), funs(./averageTotal * 100)) 

## # A tibble: 5 × 9 
##  Type.1 count averageTotal averageHP averageAttack averageDefense averageSpAtk averageSp..Def 
##  <fctr> <int>  <dbl>  <dbl>   <dbl>   <dbl>  <dbl>   <dbl> 
## 1  Bug 69  378.9275 15.01186  18.72944  18.66443  14.21633  17.10013 
## 2  Dark 31  445.7419 14.98770  19.82921  15.75481  16.74627  15.59560 
## 3 Dragon 32  550.5312 15.13311  20.36669  15.68939  17.59096  16.13782 
## 4 Electric 44  443.4091 13.48539  15.58175  14.95131  20.30241  16.62225 
## 5 Fairy 17  413.1765 17.93850  14.89180  15.90262  19.00626  20.50114 
## # ... with 1 more variables: averageSpeed <dbl> 
+0

Спасибо! Приятно знать, что. может сделать в dplyr :) –