我有一个变量名称的数据框如下:
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的观察。
我想做什么:
与上一个时间点相比,计算不同时间点参数的变化
20MPACE.1-20MPACE.0
20MPACE.3-20MPACE.1
20MPACE.5-20MPACE.3
KOOSKPL.1 - KOOSKPL.0
KOOSKPL.3 - KOOSKPL.1
KOOSKPL.5 - KOOSKPL.3
将此结果放在相应的列中:
delta.20MPACE.1
delta.20MPACE.3
delta.20MPACE.5。
delta.KOOSKPL.1
delta.KOOSKPL.3
delta.KOOSKPL.5
计算与时间点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
再次,将结果放在列中:
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)?有办法吗?
我非常感谢您提出的迅速而翔实的评论! 但是,作为初学者,我需要一些时间来处理信息,但我仍然不理解你告诉我的一切。
再次感谢。
答案 0 :(得分:2)
我看到你想要的两种可能性,但你的问题中你真的不清楚。可能性#1正如Maxim K所假设的那样,每行diff
为data.frame
。可能性#2是您希望{<1}}跨行按行分组(“a”到“j”)。
在开始之前,这里有一些示例数据。我只为团体“a”和“b”做过。
diff
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
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
中,x2
与x2-x1
的{{1}}和hello
的差异相当于hello 1
。正在寻找。
希望它有所帮助。