首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将数据透视表转移到R中的另一个表

将数据透视表转移到R中的另一个表
EN

Stack Overflow用户
提问于 2018-01-22 17:56:42
回答 1查看 51关注 0票数 2

在我的研究中,我有一个癌症患者的数据集,其中包含一些临床信息,如癌症分期和治疗等。每个患者在表中有一行,其中包含这些临床信息。此外,每个患者在治疗过程中的一个或几个时间点都会采集血液样本,这取决于患者在诊所被跟踪的时间有多长。第一个样本来自第一次就诊,第二个样本来自诊所的第二次就诊,以此类推。

在该表中,有一个变量(即列),名为Sample_Time_1,这是第一个样本的时间。Sample_Time_2有第二个样本的时间(日期),依此类推。

然而,样本是在实验室分析的,我在一个数据透视表中得到了结果,这意味着我有一个表,其中每个样本都有一行,因此一个患者的结果显示在几行上。

例如,创建两个表:

代码语言:javascript
复制
x  <- c(1,2,2,3,3,3,3,4,5,6,6,6,6,7,8,9,9,10)
y  <- as.Date(c("2011-05-17","2012-06-30","2012-08-11","2011-10-15","2011-11-25","2012-01-07","2012-02-15","2011-08-13","2012-02-03","2011-11-08","2011-12-21","2012-02-01","2012-03-12","2012-01-03","2012-04-20","2012-03-31","2012-05-10","2011-12-15"), format="%Y-%m-%d", origin="1960-01-01")
z  <- c(123,185,153,153,125,148,168,187,194,115,165,167,143,151,129,130,151,134)

Sheet_1  <- matrix(c(x,y,z), ncol=3, byrow=FALSE)
colnames(Sheet_1)  <- c("ID","Sample_Time", "Sample_Value")

Sheet_1  <- as.data.frame(Sheet_1)
Sheet_1$Sample_Time  <- y

x1  <- c(1,2,3,4,5,6,7,8,9,10)
x2  <- c(3,3,2,3,2,2,4,2,3,3)
x3  <- c(1,2,2,3,3,1,3,1,1,2)
x4  <- as.Date(c("2011-05-17","2012-06-30","2011-10-15","2011-08-13","2012-02-03","2011-11-08","2012-01-03","2012-04-20","2012-03-31","2011-12-15"), format="%Y-%m-%d", origin="1960-01-01")
x5  <- as.Date(c(NA,"2012-08-11","2011-11-25",NA,NA,"2011-12-21",NA,NA,"2012-05-10",NA), format="%Y-%m-%d", origin="1960-01-01")
x6  <- as.Date(c(NA,NA,"2012-01-07",NA,NA,"2012-02-01",NA,NA,NA,NA), format="%Y-%m-%d", origin="1960-01-01")
x7  <- as.Date(c(NA,NA,"2012-02-15",NA,NA,"2012-03-12",NA,NA,NA,NA), format="%Y-%m-%d", origin="1960-01-01")


Sheet_2  <- as.data.frame(c(1:10))
colnames(Sheet_2)  <- "ID"
Sheet_2$Stage  <- x2
Sheet_2$Treatment  <- x3
Sheet_2$Sample_Time_1  <- x4
Sheet_2$Sample_Time_2  <- x5
Sheet_2$Sample_Time_3  <- x6
Sheet_2$Sample_Time_4  <- x7

Sheet_2$Sample_Value_1  <- NA
Sheet_2$Sample_Value_2  <- NA
Sheet_2$Sample_Value_3  <- NA
Sheet_2$Sample_Value_4  <- NA

我想把第一次从病人身上抽取样本的Sample_Value从Sheet_1转移到Sheet_2$Sample_Value_1,如果有更多的样本,我想转移到"Sample_Value_2“栏,依此类推。

我已经尝试了一个双for循环。对于Sheet_1中的每个患者(= ID ),我已经运行了Sheet_2,如果ID上有一个mach,那么我使用另一个For循环来查看Sample_Time上是否有一个mach,并插入(如果使用) Sample_Value。然而,我没有设法让它工作,我强烈地感觉到一定有更好的方法。

有什么建议吗?

EN

回答 1

Stack Overflow用户

发布于 2018-01-22 18:55:57

这就是你想要的:

通过为每个患者的每个血液样本引入一个具有唯一ID的额外列,为从长到宽的重塑准备Sheet_1

代码语言:javascript
复制
Sheet_1$uniqid <- with(Sheet_1, ave(as.character(ID), ID, FUN = seq_along))

在此基础上,进行重塑

代码语言:javascript
复制
S_1 <- reshape( Sheet_1, idvar = "ID", timevar = "uniqid", direction = "wide")

这给了你

代码语言:javascript
复制
> S_1
   ID Sample_Time.1 Sample_Value.1 Sample_Time.2 Sample_Value.2 Sample_Time.3
1   1    2011-05-17            123          <NA>             NA          <NA>
2   2    2012-06-30            185    2012-08-11            153          <NA>
4   3    2011-10-15            153    2011-11-25            125    2012-01-07
8   4    2011-08-13            187          <NA>             NA          <NA>
9   5    2012-02-03            194          <NA>             NA          <NA>
10  6    2011-11-08            115    2011-12-21            165    2012-02-01
14  7    2012-01-03            151          <NA>             NA          <NA>
15  8    2012-04-20            129          <NA>             NA          <NA>
16  9    2012-03-31            130    2012-05-10            151          <NA>
18 10    2011-12-15            134          <NA>             NA          <NA>
   Sample_Value.3 Sample_Time.4 Sample_Value.4
1              NA          <NA>             NA
2              NA          <NA>             NA
4             148    2012-02-15            168
8              NA          <NA>             NA
9              NA          <NA>             NA
10            167    2012-03-12            143
14             NA          <NA>             NA
15             NA          <NA>             NA
16             NA          <NA>             NA
18             NA          <NA>             NA

在列名称中,点后面的数字是uniqid

现在,您可以合并Sheet_2中的相关列

代码语言:javascript
复制
S_2 <- merge( Sheet_2[ 1:3 ], S_1, by = "ID" )

结果应该是你想要的结果:

代码语言:javascript
复制
> S_2
   ID Stage Treatment Sample_Time.1 Sample_Value.1 Sample_Time.2 Sample_Value.2
1   1     3         1    2011-05-17            123          <NA>             NA
2   2     3         2    2012-06-30            185    2012-08-11            153
3   3     2         2    2011-10-15            153    2011-11-25            125
4   4     3         3    2011-08-13            187          <NA>             NA
5   5     2         3    2012-02-03            194          <NA>             NA
6   6     2         1    2011-11-08            115    2011-12-21            165
7   7     4         3    2012-01-03            151          <NA>             NA
8   8     2         1    2012-04-20            129          <NA>             NA
9   9     3         1    2012-03-31            130    2012-05-10            151
10 10     3         2    2011-12-15            134          <NA>             NA
   Sample_Time.3 Sample_Value.3 Sample_Time.4 Sample_Value.4
1           <NA>             NA          <NA>             NA
2           <NA>             NA          <NA>             NA
3     2012-01-07            148    2012-02-15            168
4           <NA>             NA          <NA>             NA
5           <NA>             NA          <NA>             NA
6     2012-02-01            167    2012-03-12            143
7           <NA>             NA          <NA>             NA
8           <NA>             NA          <NA>             NA
9           <NA>             NA          <NA>             NA
10          <NA>             NA          <NA>             NA
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48378790

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档