首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R中数据的重新排列

R中数据的重新排列
EN

Stack Overflow用户
提问于 2013-02-25 01:11:59
回答 3查看 191关注 0票数 2

我正在努力(有效)重新安排R中的数据。

我的数据是从两组参与者(1或0,即疾病组和对照组)的四个不同实验中收集到的实验数据。

示例dataframe:

代码语言:javascript
复制
Subject type    Experiment 1    Experiment 2    Experiment 3    Experiment 4
           0             4.6             2.5             1.4             5.3
           0             4.7             2.4             1.8             5.1
           1             3.5             1.2             5.6             7.5
           1             3.8             1.7             6.2             8.1

我想重新排列我的数据,以便它的结构如下(原因是,当数据在R中这样构造时,它使我更容易在数据上运行函数):

代码语言:javascript
复制
Subject type    Experiment    Measure
           0             1        4.6
           0             2        2.5
           0             3        1.4
           0             4        5.3
           0             1        4.7
           0             2        2.4
           0             3        1.8
           0             4        5.1
           1             1        3.5
           1             2        1.2
           1             3        5.6
           1             4        7.5
           1             1        3.8
           1             2        1.7
           1             3        6.2
           1             4        8.1

正如您所看到的,所发生的事情是,每个主题现在占据四行;每一行现在属于单个度量,而不是单个主题。这对我来说(至少现在)插入R函数更方便。也许我迟早会想出一种完全跳过这一步的方法,但我对R并不熟悉,这似乎是最好的方法。

无论如何-问题是,进行数据转换的最有效方法是什么?目前我是这样做的:

代码语言:javascript
复制
# Input dframe1
dframe1 <- structure(list(subject_type = c(0L, 0L, 1L, 1L), experiment_1 = c(4.6, 
4.7, 3.5, 3.8), experiment_2 = c(2.5, 2.4, 1.2, 1.7), experiment_3 = c(1.4, 
1.8, 5.6, 6.2), experiment_4 = c(5.3, 5.1, 7.5, 8.1)), .Names = c("subject_type", 
"experiment_1", "experiment_2", "experiment_3", "experiment_4"
), class = "data.frame", row.names = c(NA, -4L))

# Create a matrix
temporary_matrix <- matrix(ncol=3, nrow=nrow(dframe1) * 4)
colnames(temporary_matrix) <- c("subject_type","experiment","measure")

# Rearrange dframe1 so that a different measure is in each column
for(i in 1:nrow(dframe1)) {
  temporary_matrix[i*4-3,"subject_type"] <- dframe1$subject_type[i]
  temporary_matrix[i*4-3,"experiment"] <- 1
  temporary_matrix[i*4-3,"measure"] <- dframe1$experiment_1[i]
  temporary_matrix[i*4-2,"subject_type"] <- dframe1$subject_type[i]
  temporary_matrix[i*4-2,"experiment"] <- 2
  temporary_matrix[i*4-2,"measure"] <- dframe1$experiment_2[i]
  temporary_matrix[i*4-1,"subject_type"] <- dframe1$subject_type[i]
  temporary_matrix[i*4-1,"experiment"] <- 3
  temporary_matrix[i*4-1,"measure"] <- dframe1$experiment_3[i]
  temporary_matrix[i*4-0,"subject_type"] <- dframe1$subject_type[i]
  temporary_matrix[i*4-0,"experiment"] <- 4
  temporary_matrix[i*4-0,"measure"] <- dframe1$experiment_4[i]
}

# Convert matrix to a data frame
dframe2 <- data.frame(temporary_matrix)

# NOTE: For some reason, this has to be converted back into a double (at some point above it becomes a factor)
dframe2$measure <- as.double(as.character(dframe2$measure))

肯定有更好的方法吗?!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-02-25 01:23:44

使用reshape2包,这是非常简单的。

代码语言:javascript
复制
library(reshape2)

# assuming your data.frame is called `dat`
melt(dat, id.vars=c("Subject type"))

如果你愿意的话,你可以做得更好:

代码语言:javascript
复制
newdat <- melt(dat, id.vars=c("Subject type"), variable.name="Experiment", value.name="Measure")

# remove "experiment " from the names, and convert to numeric
newdat$Experiment <- as.numeric(gsub("Experiment\\s*", "", as.character(newdat$Experiment)))
票数 5
EN

Stack Overflow用户

发布于 2013-02-25 01:54:23

基本reshape方法:

获取数据:

代码语言:javascript
复制
dframe1 <- structure(list(subject_type = c(0L, 0L, 1L, 1L), experiment_1 = c(4.6, 
4.7, 3.5, 3.8), experiment_2 = c(2.5, 2.4, 1.2, 1.7), experiment_3 = c(1.4, 
1.8, 5.6, 6.2), experiment_4 = c(5.3, 5.1, 7.5, 8.1)), .Names = c("subject_type", 
"experiment_1", "experiment_2", "experiment_3", "experiment_4"
), class = "data.frame", row.names = c(NA, -4L))

将变量设置为堆栈:

代码语言:javascript
复制
expandvars <- paste('experiment',1:4,sep='_')

重塑!

代码语言:javascript
复制
dfrm1res <- reshape(
                   dframe1,
                   idvar="subject_type",
                   varying=list(expandvars),
                   v.names=c("value"),
                   direction="long",
                   new.row.names=1:16
                    )

结果:

代码语言:javascript
复制
> dfrm1res
   subject_type time value
1             0    1   4.6
2             0    1   4.7
3             1    1   3.5
4             1    1   3.8
5             0    2   2.5
6             0    2   2.4
7             1    2   1.2
8             1    2   1.7
9             0    3   1.4
10            0    3   1.8
11            1    3   5.6
12            1    3   6.2
13            0    4   5.3
14            0    4   5.1
15            1    4   7.5
16            1    4   8.1
票数 4
EN

Stack Overflow用户

发布于 2013-02-25 02:03:29

代码语言:javascript
复制
data.frame(subject_type=dframe1$subject_type, stack(dframe1[2:5] )  )
   subject_type values          ind
1             0    4.6 experiment_1
2             0    4.7 experiment_1
3             1    3.5 experiment_1
4             1    3.8 experiment_1
5             0    2.5 experiment_2
6             0    2.4 experiment_2
7             1    1.2 experiment_2
8             1    1.7 experiment_2
9             0    1.4 experiment_3
10            0    1.8 experiment_3
11            1    5.6 experiment_3
12            1    6.2 experiment_3
13            0    5.3 experiment_4
14            0    5.1 experiment_4
15            1    7.5 experiment_4
16            1    8.1 experiment_4

或者使用基本的reshape (尽管我的首选项似乎与它的使用不同):

代码语言:javascript
复制
dframe1$subject=1:4
reshape(dframe1, direction="long", idvar=c("subject_type", "subject"),
                 varying=2:5, sep="_", v.names="exp_value")
 #--------------------------
      subject_type subject time exp_value
0.1.1            0       1    1       4.6
0.2.1            0       2    1       4.7
1.3.1            1       3    1       3.5
1.4.1            1       4    1       3.8
0.1.2            0       1    2       2.5
0.2.2            0       2    2       2.4
1.3.2            1       3    2       1.2
1.4.2            1       4    2       1.7
0.1.3            0       1    3       1.4
0.2.3            0       2    3       1.8
1.3.3            1       3    3       5.6
1.4.3            1       4    3       6.2
0.1.4            0       1    4       5.3
0.2.4            0       2    4       5.1
1.3.4            1       3    4       7.5
1.4.4            1       4    4       8.1
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15058706

复制
相关文章

相似问题

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