对所选变量组的计算

时间:2013-04-18 08:55:50

标签: r

我有一个变量名称的数据框如下:

a.1, a.3,  a.5,  a.6,  a.9, a.10, a.12

b.1, b.3,  b.5,  b.6,  b.9, b.10, b.12

等从a到j。

变量的名称代表纵向研究中的评估参数和访问次数。

数据框还包含固定的基线参数。

我想创建新的变量来表示自上次访问以来每个参数的变化:

delta.a.3 <- a.3 - a.1
delta.a.5 <- a.5 - a.3
所有参数的所有访问都是

等等。

有没有办法自动执行此任务?

以下是我的数据框摘录:

      ID      DIAB    AGE 20MPACE.0 20MPACE.1 20MPACE.3 20MPACE.5 KOOSKPL.0 KOOSKPL.1 KOOSKPL.3 KOOSKPL.5
1 9000099       0     59    1.3280    1.2946    1.3500    1.2772    100.00     88.89     80.56     83.33
2 9000296       0     69    1.3658    1.3142        NA    1.3944    100.00    100.00    100.00    100.00
3 9000622       0     71    1.4305    1.5178        NA        NA    100.00    100.00        NA        NA
4 9000798       0     56    1.0636    1.2342    1.1969    1.1572     59.38     59.38     65.63     59.38
5 9001104       0     72    1.3924    1.3473        NA        NA    100.00    100.00     83.33        NA
6 9001400       0     75    1.6203    1.5015    1.5051    1.4264    100.00    100.00    100.00     91.67

ID,DIAB,AGE - “静止”基线参数。 20MPACE.0,20MPACE.1,20MPACE.3,20MPACE.5 - 在时间点0,1,3,5上观察20MPACE。 KOOSKPL.0,KOOSKPL.1 KOOSKPL.3和KOOSKPL.5 - 在时间点0,1,3,5上对KOOSKPL的观察。

我想做什么:

  1. 上一个时间点相比,计算不同时间点参数的变化

    20MPACE.1-20MPACE.0

    20MPACE.3-20MPACE.1

    20MPACE.5-20MPACE.3

    KOOSKPL.1 - KOOSKPL.0

    KOOSKPL.3 - KOOSKPL.1

    KOOSKPL.5 - KOOSKPL.3

  2. 将此结果放在相应的列中:

    delta.20MPACE.1

    delta.20MPACE.3

    delta.20MPACE.5。

    delta.KOOSKPL.1

    delta.KOOSKPL.3

    delta.KOOSKPL.5

  3. 计算与时间点0相关的不同时间点的参数变化

    20MPACE.1-20MPACE.0

    20MPACE.3-20MPACE.0

    20MPACE.5-20MPACE.0

    KOOSKPL.1 - KOOSKPL.0

    KOOSKPL.3 - KOOSKPL.0

    KOOSKPL.5 - KOOSKPL.0

  4. 再次,将结果放在列中:

    delta0.20MPACE.1

    delta0.20MPACE.3

    delta0.20MPACE.5。

    delta0.KOOSKPL.1

    delta0.KOOSKPL.3

    delta0.KOOSKPL.5

  5. 我没有先问过最后两个问题。

    可能关键是要对具有相同前缀的变量选择循环工作(例如20MPACE.0,20MPACE.1,20MPACE.3,20MPACE.5)?有办法吗?

    我非常感谢您提出的迅速而翔实的评论! 但是,作为初学者,我需要一些时间来处理信息,但我仍然不理解你告诉我的一切。

    再次感谢。

3 个答案:

答案 0 :(得分:2)

我看到你想要的两种可能性,但你的问题中你真的不清楚。可能性#1正如Maxim K所假设的那样,每行diffdata.frame。可能性#2是您希望{<1}}跨行按行分组(“a”到“j”)。

在开始之前,这里有一些示例数据。我只为团体“a”和“b”做过。

diff

可能性#1

set.seed(1)
mydf <- data.frame(matrix(sample(100, 50, replace = TRUE), ncol = 10))
names(mydf) <- paste(rep(c("a", "b"), each = 5), c(1, 3, 5, 7, 9), sep = ".")
mydf
#   a.1 a.3 a.5 a.7 a.9 b.1 b.3 b.5 b.7 b.9
# 1  27  90  21  50  94  39  49  67  83  79
# 2  38  95  18  72  22   2  60  80  65   3
# 3  58  67  69 100  66  39  50  11  79  48
# 4  91  63  39  39  13  87  19  73  56  74
# 5  21   7  77  78  27  35  83  42  53  70

可能性#2

mydf[-1] - mydf[-length(mydf)]
#   a.3 a.5 a.7 a.9 b.1 b.3 b.5 b.7 b.9
# 1  63 -69  29  44 -55  10  18  16  -4
# 2  57 -77  54 -50 -20  58  20 -15 -62
# 3   9   2  31 -34 -27  11 -39  68 -31
# 4 -28 -24   0 -26  74 -68  54 -17  18
# 5 -14  70   1 -51   8  48 -41  11  17

当然,这只是为了让你开始,因为我对你的最终目标一点也不清楚。

答案 1 :(得分:1)

如果我正确理解您的问题,您希望在特定范围内自动分配变量名称。您将需要根据您的情况调整以下代码,因为它没有完全指定,正如@ SimonO101所指出的那样。假设您的原始数据框名为df

delta <- matrix(NA,nrow=nrow(df))         # this will be the matrix of differences

for (i in 2:(ncol(df))) {
  delta <- cbind(delta,df[,i] - df[,i-1]) # in this loop we take the differences between 
}                                         # i'th and i-1'th element. You may want to adjust this.

result.df <- cbind(delta[,-1],df)         # combine both matrices (coerced to dataframe)

# finally, name the variables using paste()
names(result.df) <- c(paste0("diff",2:ncol(df),".",1:(ncol(df)-1)),names(df))

最后一行发生的事情是我们通过paste创建一个新变量变量名的向量 - 结合(组合)以下值:新变量名前缀(diff),第一个变量的数量在减法,点,第二个变量的名称。我们c()ombine表示原始名称向量。您可能希望单独运行paste0("diff",2:ncol(df),".",1:(ncol(df)-1))以查看其工作原理。根据您的需要调整paste0的参数。希望这可以帮助。

答案 2 :(得分:0)

我假设自己的数据,因为你没有真正的价值。

## create two vectors of length 10
> hello <- seq(from=1, by=5, length =10)
> hello1 <- c(5,11,13,18,25,26,54,98,78,100)

> jd <- rbind(hello,hello1)
# Create a dataframe
> h1 <- data.frame(jd)
> h1
       X1 X2 X3 X4 X5 X6 X7 X8 X9 X10
hello   1  6 11 16 21 26 31 36 41  46
hello1  5 11 13 18 25 26 54 98 78 100
> 
> jd1 <- apply(h1,1,diff)
> jd1
    hello hello1
X2      5      6
X3      5      2
X4      5      5
X5      5      7
X6      5      1
X7      5     28
X8      5     44
X9      5    -20
X10     5     22

在数据框jd1中,x2x2-x1的{​​{1}}和hello的差异相当于hello 1。正在寻找。

希望它有所帮助。