0

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

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 - 在时间点上观察 KOOSKPL 0、1、3、5。

我想做的事:

  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

我一开始没有问最后两个问题。

可能的重点是使循环有选择地在具有相同前缀的变量上工作(例如 20MPACE.0、20MPACE.1、20MPACE.3、20MPACE.5)?有没有办法做到这一点?

我非常感谢您提出的及时且内容丰富的评论!然而,作为一个初学者,我需要一些时间来处理信息,我仍然不明白你告诉我的一切。

再次感谢。

4

3 回答 3

2

我看到你想要的两种可能性,但你的问题真的不清楚。可能性 #1 正如 Maxim K 所假设的那样,diff在每一行中都是完整的data.frame。可能性 #2 是您希望按组(“a”到“j”)diff跨越每一行。

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

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

可能性 #1

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

可能性 #2

lapply(letters[1:2], 
       function(x) {
         temp <- mydf[grepl(paste("^", x, sep = ""), names(mydf))] 
         temp[-1] - temp[-length(temp)]
       })
# [[1]]
#   a.3 a.5 a.7 a.9
# 1  63 -69  29  44
# 2  57 -77  54 -50
# 3   9   2  31 -34
# 4 -28 -24   0 -26
# 5 -14  70   1 -51
# 
# [[2]]
#   b.3 b.5 b.7 b.9
# 1  10  18  16  -4
# 2  58  20 -15 -62
# 3  11 -39  68 -31
# 4 -68  54 -17  18
# 5  48 -41  11  17

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

于 2013-04-18T10:04:45.640 回答
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-ing(组合)以下值来为新变量创建一个变量名向量:新变量名前缀 (diff)、减法中第一个变量的编号、点、名称第二个变量。我们 c() 结合了原始名称向量。您可能希望paste0("diff",2:ncol(df),".",1:(ncol(df)-1))单独运行以查看其工作原理。paste0根据您的需要调整参数。希望这可以帮助。

于 2013-04-18T09:14:43.627 回答
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

在数据框中jd1x2x2-x1for的区别hellohello 1它等同于a.3 - a.1您正在寻找的。

希望能帮助到你。

于 2013-04-18T10:01:54.193 回答