代码之家  ›  专栏  ›  技术社区  ›  Dr. Fabian Habersack

计算R中宽格式数据集中n个列的移动(var_t0-var_t1)

  •  1
  • Dr. Fabian Habersack  · 技术社区  · 7 年前

    我想知道是否有一个简洁的方法(可能是一个循环)来完成我的任务。首先,我的数据结构大致如下:

    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 回复  |  直到 7 年前
        1
  •  1
  •   DanY    7 年前

    使用双括号指定新列,并使用 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)]]
    
        2
  •  1
  •   Chriss Paul    7 年前

    你可能只需要把你的数据整理成一个列表,然后像这样做

    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