Вычислить движение (var_t0 - var_t1) для n номеров столбцов в широкоформатном наборе данных в R - PullRequest
0 голосов
/ 31 августа 2018

Мне было интересно, есть ли аккуратный способ (вероятно, цикл) для моей задачи. Прежде всего, мои данные более или менее структурированы так:

MyData<-data.frame("date"=c(2006,2006,2006,2010,2010,2010,2014,2014,2014),
                "party"=c("A","B","C","A","B","C","A","B","C"),
                "value_1"=c(sample(1:100,9,rep=T)),
                "value_2"=c(sample(1:100,9,rep=T)),
                "value_k"=c(sample(1:100,9,rep=T)))

Теперь мне нужно движение каждой политической партии по «стоимости» от одного момента времени к другому (например, движение партии А с 2006 по 2010 год =?). С этой целью я изменил свои данные:

MyData_wide <- reshape(MyData, direction = "wide", timevar = "date", idvar = c("party"))

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

MyData_wide$move_val1_0610 <- MyData_wide$value1.2006 - MyData_wide$value1.2010

Теперь предположим, что у меня есть k из этих "значений" -вариантов. Есть ли способ использовать цикл for () для более быстрого вычисления этих движений?

Я хотел бы сказать, что R «для каждой пары переменных-значений возьмите последнюю и вычтите ее из первой, и для каждой из этих вычитаний создайте новую переменную в MyData_wide, которая выглядит следующим образом. $ Move_val1_0610»

Ответы [ 2 ]

0 голосов
/ 01 сентября 2018

Возможно, вам просто нужно упорядочить данные в списке, а затем сделать что-то вроде этого

set.seed(1234L) # For reproducibility
MyData<-data.frame("date"=c(2006,2006,2006,2010,2010,2010,2014,2014,2014),
                   "party"=c("A","B","C","A","B","C","A","B","C"),
                   "value_1"=c(sample(1:100,9,rep=T)),
                   "value_2"=c(sample(1:100,9,rep=T)),
                   "value_k"=c(sample(1:100,9,rep=T)))
MyData
  date party value_1 value_2 value_k
1 2006     A      12      52      19
2 2006     B      63      70      24
3 2006     C      61      55      32
4 2010     A      63      29      31
5 2010     B      87      93      16
6 2010     C      65      30       4
7 2014     A       1      84      22
8 2014     B      24      29      82
9 2014     C      67      27      53

temp <- split(MyData, MyData$party) #converting into a list with respect to variable party

temp
$A
  date party value_1 value_2 value_k
1 2006     A      12      52      19
4 2010     A      63      29      31
7 2014     A       1      84      22

$B
  date party value_1 value_2 value_k
2 2006     B      63      70      24
5 2010     B      87      93      16
8 2014     B      24      29      82

$C
  date party value_1 value_2 value_k
3 2006     C      61      55      32
6 2010     C      65      30       4
9 2014     C      67      27      53

foo <- function(x) {apply(x[,3:5], MARGIN = 2,FUN = diff)} # function to compute the 1 lag difference in columns 3 4 and 5 of a data.frame x
res <- lapply(temp, foo) # applying foo to each element of temp

res
$A
  value_1 value_2 value_k
4      51     -23      12
7     -62      55      -9

$B
  value_1 value_2 value_k
5      24      23      -8
8     -63     -64      66

$C
  value_1 value_2 value_k
6       4     -25     -28
9       2      -3      49
0 голосов
/ 31 августа 2018

Используйте двойные скобки для назначения новых столбцов и используйте paste, чтобы назвать их:

for (i in c("1", "2", "k")) {
    MyData_wide[[paste0("newvar",i)]] <- 
        MyData_wide[[paste0("value_",i,".2006")]] -  
        MyData_wide[[paste0("value_",i,".2010")]]
}

Вы должны проявить изобретательность в цикле, чтобы выполнить часть «для каждой пары переменных значения». Я бы предложил использовать переменную года, назовем ее y и выбрать переменные с y и y+4 в именах:

MyData_wide[[paste0("value_",i,".",y)]] - MyData_wide[[paste0("value_",i,".",y+4)]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...