Как рассчитать процентную разницу в таблице в R - PullRequest
1 голос
/ 22 апреля 2019

У меня есть файл csv, где строки 1-5 представляют одно состояние, 5-10 другое и т. Д. У меня также есть столбец с годами 1970,1980,..,2010, повторяемыми для каждого состояния. В R (хотя я не против решения в Excel, если это проще), я хочу, чтобы для каждого штата вычислялась разница в процентах между этим годом и 1970, то есть для Alabama 1990 это было бы (AL 1990 - AL 1970)/(AL 1970), и добавьте его в новый столбец таблицы данных, чтобы я мог экспортировать его в csv.

   State, Year, Num  
    AL,   1970,  1   
    AL,   1980,  2   
    AL,   1990,  3   
    AL,   2000,  4   
    AL,   2010,  6   

Вывод будет столбец

pct_change
0
1
2
3
5

Ответы [ 3 ]

3 голосов
/ 22 апреля 2019

В пакет dplyr входит функция first, которая обеспечивает простой способ получения первого значения группы.Поэтому, если мы договоримся по Year, чтобы 1970 было первым значением в каждой группе, когда мы group_by(State), мы можем использовать first(Num), чтобы получить первое значение Num, которое представляет значение 1970:

# Example data with 2 states

df <- structure(list(State = c("AL", "AL", "AL", "AL", "AL", "TX", 
"TX", "TX", "TX", "TX"), Year = c(1970L, 1980L, 1990L, 2000L, 
2010L, 1970L, 1980L, 1990L, 2000L, 2010L), Num = c(1, 2, 3, 4, 
6, 5, 2, 10, 12, 6)), class = "data.frame", row.names = c(NA, 
-10L))


library(dplyr)
df %>%
    arrange(State, Year) %>%
    group_by(State) %>%
    mutate(perc_diff = 100 * (Num - first(Num))/first(Num))

# A tibble: 10 x 4
# Groups:   State [2]
   State  Year   Num perc_diff
   <chr> <int> <dbl>     <dbl>
 1 AL     1970     1         0
 2 AL     1980     2       100
 3 AL     1990     3       200
 4 AL     2000     4       300
 5 AL     2010     6       500
 6 TX     1970     5         0
 7 TX     1980     2       -60
 8 TX     1990    10       100
 9 TX     2000    12       140
10 TX     2010     6        20
1 голос
/ 22 апреля 2019

Мы можем использовать data.table. Преобразуйте «data.frame» в «data.table» (setDT(df)), order по «State», «Year» в i, сгруппированных по «State», получите разницу в «Num» со значением first «Num» и назначьте (:=) для создания «perc_diff»

library(data.table)
setDT(df)[order(State, Year), perc_diff := 
            100 * (Num - first(Num))/first(Num), State][]
#     State Year Num perc_diff
# 1:    AL 1970   1         0
# 2:    AL 1980   2       100
# 3:    AL 1990   3       200
# 4:    AL 2000   4       300
# 5:    AL 2010   6       500
# 6:    TX 1970   5         0
# 7:    TX 1980   2       -60
# 8:    TX 1990  10       100
# 9:    TX 2000  12       140
#10:    TX 2010   6        20

Или используя base R

v1 <- with(df, ave(Num, State, FUN = function(x) x[1]))
df$perc_diff <-  with(df, 100 * (Num - v1)/v1)

данные

df <- structure(list(State = c("AL", "AL", "AL", "AL", "AL", "TX", 
 "TX", "TX", "TX", "TX"), Year = c(1970L, 1980L, 1990L, 2000L, 
 2010L, 1970L, 1980L, 1990L, 2000L, 2010L), Num = c(1, 2, 3, 4, 
 6, 5, 2, 10, 12, 6)), class = "data.frame", row.names = c(NA, 
 -10L))
0 голосов
/ 22 апреля 2019

База R раствор с использованием tapply

df <- df[with(df, order(State, Year)), ]
df$pct_change <- unlist( tapply(df$Num, df$State, function(x) 100 * (x - x[1]) / x[1]) )

> df
   State Year Num pct_change
1     AL 1970   1          0
2     AL 1980   2        100
3     AL 1990   3        200
4     AL 2000   4        300
5     AL 2010   6        500
6     TX 1970   5          0
7     TX 1980   2        -60
8     TX 1990  10        100
9     TX 2000  12        140
10    TX 2010   6         20
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...