旋转/重塑R中的数据 [英] Pivot/Reshape data in R
本文介绍了旋转/重塑R中的数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
感谢大家的回答,我认为我比我更聪明,希望我能理解其中的任何一条。我想我也搞砸了我的数据可视化。我已经编辑了我的帖子,以更好地展示我的样本数据。很抱歉给您带来不便,我真心希望有人能帮我。
我有一个关于重塑数据的问题。收集的数据如下:
data <- read.table(header=T, text='
pid measurement1 Tdays1 measurement2 Tdays2 measurement3 Tdays3 measurment4 Tdays4
1 1356 1435 1483 1405 1563 1374 NA NA
2 943 1848 1173 1818 1300 1785 NA NA
3 1590 185 NA NA NA NA 1585 294
4 130 72 443 70 NA NA 136 79
4 140 82 NA NA NA NA 756 89
4 220 126 266 124 NA NA 703 128
4 166 159 213 156 476 145 776 166
4 380 189 583 173 NA NA 586 203
4 353 231 510 222 656 217 526 240
4 180 268 NA NA NA NA NA NA
4 NA NA NA NA NA NA 580 278
4 571 334 596 303 816 289 483 371
')
现在我希望它看起来像这样:
PID Time Value
1 1435 1356
1 1405 1483
1 1374 1563
2 1848 943
2 1818 1173
2 1785 1300
3 185 1590
... ... ...
我要如何才能到达那里?我已经查找了一些关于宽到长格式的东西,但它似乎没有起到作用。我是RStudio和Stackoverflow的新手(如果您还不知道的话)。
向您致以亲切的问候,并提前表示感谢。
推荐答案
在上一次编辑中,您要求提供易于理解的解决方案。一种非常简单的方法是将度量列堆叠在一起,并将Tday列堆叠在一起。尽管专业套餐让事情变得非常简洁和优雅,但为了简单起见,我们可以在没有额外套餐的情况下解决这一问题。Standard R有一个方便的函数,名为stack
,其工作原理如下:
> exp <- data.frame(value1 = 1:5, value2 = 6:10)
> stack(exp)
values ind
1 1 value1
2 2 value1
3 3 value1
4 4 value1
5 5 value1
6 6 value2
7 7 value2
8 8 value2
9 9 value2
10 10 value2
我们可以将测量值和Tday分开堆叠,然后通过cbind
合并:
data <- read.table(header=T, text='
pid measurement1 Tdays1 measurement2 Tdays2 measurement3 Tdays3 measurement4 Tdays4
1 1356 1435 1483 1405 1563 1374 NA NA
2 943 1848 1173 1818 1300 1785 NA NA
3 1590 185 NA NA NA NA 1585 294
4 130 72 443 70 NA NA 136 79
4 140 82 NA NA NA NA 756 89
4 220 126 266 124 NA NA 703 128
4 166 159 213 156 476 145 776 166
4 380 189 583 173 NA NA 586 203
4 353 231 510 222 656 217 526 240
4 180 268 NA NA NA NA NA NA
4 NA NA NA NA NA NA 580 278
4 571 334 596 303 816 289 483 371
')
cbind(stack(data, c(measurement1, measurement2, measurement3, measurement4)),
stack(data, c(Tdays1, Tdays2, Tdays3, Tdays4)))
将测量值和Tday整齐地保存在一起,但没有pid
,我们可以使用rep
将原始的pid
复制4次:
result <- cbind(pid = rep(data$pid, 4),
stack(data, c(measurement1, measurement2, measurement3, measurement4)),
stack(data, c(Tdays1, Tdays2, Tdays3, Tdays4)))
其头部看起来像
> head(result)
pid values ind values ind
1 1 1356 measurement1 1435 Tdays1
2 2 943 measurement1 1848 Tdays1
3 3 1590 measurement1 185 Tdays1
4 4 130 measurement1 72 Tdays1
5 4 140 measurement1 82 Tdays1
6 4 220 measurement1 126 Tdays1
如上所述,这不是您预期的顺序,您可以尝试对此数据进行排序。如果有任何问题,请执行以下操作:
result <- result[order(result$pid), c(1, 4, 2)]
names(result) <- c("pid", "Time", "Value")
最终结果
> head(result)
pid Time Value
1 1 1435 1356
13 1 1405 1483
25 1 1374 1563
37 1 NA NA
2 2 1848 943
14 2 1818 1173
这篇关于旋转/重塑R中的数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文