在R中将数据从短格式重新排列为长格式
我有以下方式的数据:在R中将数据从短格式重新排列为长格式,r,R,我有以下方式的数据: level1 level2 level3 level4 controls x_11 x_12 x_13 x_14 cases x_21 x_22 x_23 x_24 什么是最好的方式把这个长的形式?具体地说,我希望x_11行位于级别0,然后是一个0的指示符,x_12行位于级别指示符0 我正试图将其放入coin库中的independence\u test函数中,这就是它所需要的数据。谢谢大家! 编辑 我有
level1 level2 level3 level4
controls x_11 x_12 x_13 x_14
cases x_21 x_22 x_23 x_24
什么是最好的方式把这个长的形式?具体地说,我希望x_11行位于级别0,然后是一个0的指示符,x_12行位于级别指示符0
我正试图将其放入coin
库中的independence\u test
函数中,这就是它所需要的数据。谢谢大家!
编辑
我有一个矩阵:
1 2 3 4
controls 9 7 7 7
cases 0 1 1 5
如何得到一个37x2的矩阵。每行将有“状态”和“bin”。例如,我会得到9行
0,1(控件,bin=1)
然后是7行:
0,2(控制,箱=2)
0行,其中包括:
0,1(箱,箱=1)
1,2(箱,箱=2)
谢谢大家!
编辑2
Dput输入/输出到以下一个解决方案:
> dput(mtx)
structure(c(9L, 0L, 7L, 1L, 7L, 1L, 7L, 5L), .Dim = c(2L, 4L), .Dimnames = list(
c("controls", "cases"), c("1", "2", "3", "4")))
dput(长)
结构(c)(“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“1”、“3”),
"3", "3", "3", "3", "3", "3", "4", "1", "1", "1", "1", "1", "1",
"1", "2", "3", "3", "3", "3", "3", "3", "3", "4", "4", "4", "4",
“4”、“控制”、“控制”、“控制”、“控制”、“控制”、“控制”,
“控制”、“控制”、“控制”、“控制”、“控制”、“控制”、“控制”,
“控制”、“控制”、“控制”、“控制”、“控制”、“控制”、“案例”,
“控制”、“控制”、“控制”、“控制”、“控制”、“控制”、“控制”,
“控制”、“案例”、“控制”、“控制”、“控制”、“控制”、“控制”,
“控制”、“控制”、“控制”、“案例”、“案例”、“案例”,
“cases”,“cases”),.Dim=c(37L,2L),.Dimnames=list(NULL,
(""状态"))
as.data.frame.table
函数和rep
函数一起可以执行您想要的操作:
> m <- matrix(1:12, 4)
> df <- as.data.frame.table(m)
> df[ rep(1:nrow(df), df$Freq), ]
Var1 Var2 Freq
1 A A 1
2 B A 2
2.1 B A 2
3 C A 3
3.1 C A 3
3.2 C A 3
4 D A 4
4.1 D A 4
4.2 D A 4
4.3 D A 4
5 A B 5
5.1 A B 5
.
.
.
>m df df[rep(1:nrow(df),df$Freq),]
Var1 Var2频率
1 A 1
2 B A 2
2.1 B A 2
3 C A 3
3.1 C A 3
3.2 C A 3
4 D A 4
4.1 D A 4
4.2 D A 4
4.3 D A 4
5 A B 5
5.1 A B 5
.
.
.
另一种选择是查看重塑2或plyr软件包。as.data.frame.table函数和
rep
函数一起可以完成您想要的功能:
> m <- matrix(1:12, 4)
> df <- as.data.frame.table(m)
> df[ rep(1:nrow(df), df$Freq), ]
Var1 Var2 Freq
1 A A 1
2 B A 2
2.1 B A 2
3 C A 3
3.1 C A 3
3.2 C A 3
4 D A 4
4.1 D A 4
4.2 D A 4
4.3 D A 4
5 A B 5
5.1 A B 5
.
.
.
>m df df[rep(1:nrow(df),df$Freq),]
Var1 Var2频率
1 A 1
2 B A 2
2.1 B A 2
3 C A 3
3.1 C A 3
3.2 C A 3
4 D A 4
4.1 D A 4
4.2 D A 4
4.3 D A 4
5 A B 5
5.1 A B 5
.
.
.
另一种选择可能是查看重塑2或plyr软件包。如果您想将数据从宽更改为长,则
melt
功能非常有用。我试图创建一个玩具数据集,这样你的问题就可以得到回答,尽管它可能不是你想要的(如果没有一个具体的、可复制的示例数据集,很难“猜测”某人想要做什么)
首先,我们将在R中创建玩具数据集:
df.wide <- as.data.frame(matrix(1:8,2))
colnames(df.wide) <- c("Level 1", "Level 2", "Level 3", "Level 4")
rownames(df.wide) <- c("Controls", "Cases")
# creating an id variable for the rows
df.wide$id <- rownames(df.wide)
# examining the dataframe
print(df.wide)
Level 1 Level 2 Level 3 Level 4 id
Controls 1 3 5 7 Controls
Cases 2 4 6 8 Cases
df.wide如果要将数据从宽更改为长,则melt
功能非常有用。我试图创建一个玩具数据集,这样你的问题就可以得到回答,尽管它可能不是你想要的(如果没有一个具体的、可复制的示例数据集,很难“猜测”某人想要做什么)
首先,我们将在R中创建玩具数据集:
df.wide <- as.data.frame(matrix(1:8,2))
colnames(df.wide) <- c("Level 1", "Level 2", "Level 3", "Level 4")
rownames(df.wide) <- c("Controls", "Cases")
# creating an id variable for the rows
df.wide$id <- rownames(df.wide)
# examining the dataframe
print(df.wide)
Level 1 Level 2 Level 3 Level 4 id
Controls 1 3 5 7 Controls
Cases 2 4 6 8 Cases
df.wide假设列联矩阵称为mtx:
cbind( bin=unlist(mapply( rep, times=mtx, rownames(mtx)[row(mtx)] )),
status=unlist(mapply( rep, times=mtx, colnames(mtx)[col(mtx)] ))
)
#--------------------------
bin status
[1,] "controls" "1"
[2,] "controls" "1"
[3,] "controls" "1"
[4,] "controls" "1"
[5,] "controls" "1"
[6,] "controls" "1"
[7,] "controls" "1"
[8,] "controls" "1"
[9,] "controls" "1"
[10,] "controls" "2"
[11,] "controls" "2"
[12,] "controls" "2"
[13,] "controls" "2"
[14,] "controls" "2"
[15,] "controls" "2"
[16,] "controls" "2"
[17,] "cases" "2"
[18,] "controls" "3"
[19,] "controls" "3"
[20,] "controls" "3"
[21,] "controls" "3"
[22,] "controls" "3"
[23,] "controls" "3"
[24,] "controls" "3"
[25,] "cases" "3"
[26,] "controls" "4"
[27,] "controls" "4"
[28,] "controls" "4"
[29,] "controls" "4"
[30,] "controls" "4"
[31,] "controls" "4"
[32,] "controls" "4"
[33,] "cases" "4"
[34,] "cases" "4"
[35,] "cases" "4"
[36,] "cases" "4"
[37,] "cases" "4"
要了解其工作原理,您可以使用这样的矩阵:
dput(mtx)
structure(c(9, 0, 7, 1, 7, 1, 7, 5), .Dim = c(2L, 4L), .Dimnames = list(
c("controls", "cases"), c("1", "2", "3", "4")))
假设列联矩阵称为mtx:
cbind( bin=unlist(mapply( rep, times=mtx, rownames(mtx)[row(mtx)] )),
status=unlist(mapply( rep, times=mtx, colnames(mtx)[col(mtx)] ))
)
#--------------------------
bin status
[1,] "controls" "1"
[2,] "controls" "1"
[3,] "controls" "1"
[4,] "controls" "1"
[5,] "controls" "1"
[6,] "controls" "1"
[7,] "controls" "1"
[8,] "controls" "1"
[9,] "controls" "1"
[10,] "controls" "2"
[11,] "controls" "2"
[12,] "controls" "2"
[13,] "controls" "2"
[14,] "controls" "2"
[15,] "controls" "2"
[16,] "controls" "2"
[17,] "cases" "2"
[18,] "controls" "3"
[19,] "controls" "3"
[20,] "controls" "3"
[21,] "controls" "3"
[22,] "controls" "3"
[23,] "controls" "3"
[24,] "controls" "3"
[25,] "cases" "3"
[26,] "controls" "4"
[27,] "controls" "4"
[28,] "controls" "4"
[29,] "controls" "4"
[30,] "controls" "4"
[31,] "controls" "4"
[32,] "controls" "4"
[33,] "cases" "4"
[34,] "cases" "4"
[35,] "cases" "4"
[36,] "cases" "4"
[37,] "cases" "4"
要了解其工作原理,您可以使用这样的矩阵:
dput(mtx)
structure(c(9, 0, 7, 1, 7, 1, 7, 5), .Dim = c(2L, 4L), .Dimnames = list(
c("controls", "cases"), c("1", "2", "3", "4")))
对不起,我需要一些稍微不同的东西。我做了编辑,有更多的细节。你能看一下吗?对不起,我需要一些稍微不同的东西。我做了编辑,有更多的细节。你能看一下吗?这个不行。矩阵不正确。例如,我在Bin4中没有得到带有“控件”的行。我只是再次运行它,它“工作”很好。如果您想要替代解决方案(替代问题),您需要在对象上发布dput()
。我已经添加了dput输入和输出。对于你的矩阵,我没有看到“控件,4”的元素。我现在明白了。列名混淆了。应该和编辑一起工作。@Boddedust,很抱歉,但我仍然认为它不工作。修改后的代码没有显示“2”个“案例”的行。这不起作用。矩阵不正确。例如,我在Bin4中没有得到带有“控件”的行。我只是再次运行它,它“工作”很好。如果您想要替代解决方案(替代问题),您需要在对象上发布dput()
。我已经添加了dput输入和输出。对于你的矩阵,我没有看到“控件,4”的元素。我现在明白了。列名混淆了。应该和编辑一起工作。@Boddedust,很抱歉,但我仍然认为它不工作。修改后的代码没有显示“2”个案例的行