gpt4 book ai didi

重新排列 R 中的数据,分解列名称

转载 作者:行者123 更新时间:2023-12-01 19:40:28 27 4
gpt4 key购买 nike

我得到了一张表格,我需要将其转换为其他两种形式。谁能帮我找到一种系统的 R 方式来转换它,而无需一堆嵌套的 for 循环?

这是该表的简化版本:

Status <- rep(c(paste0("B",seq(1,4)),"Total"),3)
FID <- c(rep("N123",10),rep("K541",5))
IID <- c(rep(123,5),rep(456,5),rep(789,5))

Value1.G1 <- c(rep(c(888,345,765,875,875,323),2),8039,830,849)
Value2.G1 <- c(rep(c(443,325,761),4),649,975,323)
Value1.G2 <- rep(c(446,345,765,875,323),3)
Value2.G2 <- c(rep(c(540,345,765),4),169,875,431)

dat <-data.frame(FID,IID,Status,Value1.G1,Value2.G1,Value1.G2,Value2.G2)
print(dat)
FID IID Status Value1.G1 Value2.G1 Value1.G2 Value2.G2
1 N123 123 B1 888 443 446 540
2 N123 123 B2 345 325 345 345
3 N123 123 B3 765 761 765 765
4 N123 123 B4 875 443 875 540
5 N123 123 Total 875 325 323 345
6 N123 456 B1 323 761 446 765
7 N123 456 B2 888 443 345 540
8 N123 456 B3 345 325 765 345
9 N123 456 B4 765 761 875 765
10 N123 456 Total 875 443 323 540
11 K541 789 B1 875 325 446 345
12 K541 789 B2 323 761 345 765
13 K541 789 B3 8039 649 765 169
14 K541 789 B4 830 975 875 875
15 K541 789 Total 849 323 323 431

简而言之,除了前三列之外,每个单元格中的数字是特定凝胶( Value1Value2 )上特定 sample ( 123456789 )的特定值(在本例中为 12 ) ),处于特定状态( B1B2B3B4Total )。前三列( FIDIIDStatus )列出有关示例( FIDIID )和状态( Status )的信息。

第一种形式

我需要创建的第一个表单将标题分解为其组成部分。 (澄清一点:“Gel”列是指列名称中“G”后面的前一个数值。)

    FID IID Status Value1 Value2 Gel
1 N123 123 B1 888 443 1
2 N123 456 B1 323 761 1
3 K541 789 B1 875 325 1
4 N123 123 B1 446 540 2
5 N123 456 B1 446 765 2
6 K541 789 B1 446 345 2
7 N123 123 B2 345 325 1
8 N123 456 B2 888 443 1
9 K541 789 B2 323 761 1
10 N123 123 B2 345 345 2
11 N123 456 B2 345 540 2
12 K541 789 B2 345 765 2
13 N123 123 B3 765 761 1
14 N123 456 B3 345 325 1
15 K541 789 B3 8039 649 1
16 N123 123 B3 765 765 2
17 N123 456 B3 765 345 2
18 K541 789 B3 765 169 2
19 N123 123 B4 875 443 1
20 N123 456 B4 765 761 1
21 K541 789 B4 830 975 1
22 N123 123 B4 875 540 2
23 N123 456 B4 875 765 2
24 K541 789 B4 875 875 2
25 N123 123 Total 875 325 1
26 N123 456 Total 875 443 1
27 K541 789 Total 849 323 1
28 N123 123 Total 323 345 2
29 N123 456 Total 323 540 2
30 K541 789 Total 323 431 2

第二种形式

我需要创建的第二种形式要求每个唯一的个体 id ( IID ) 都有一行包含其所有值信息。在这种情况下,列名称指示有关该值及其特定条件的所有信息(即哪个值、哪个凝胶和哪个状态)。对于此示例数据,这意味着有 3 行和 22 列。

   FID IID Value1.G1.B1 Value2.G1.B1 Value1.G2.B1 Value2.G2.B1 Value1.G1.B2 Value2.G1.B2 Value1.G2.B2
1 N123 123 888 443 446 540 345 325 345
2 N123 456 323 761 446 765 888 443 345
3 K541 789 875 325 446 345 323 761 345
Value2.G2.B2 Value1.G1.B3 Value2.G1.B3 Value1.G2.B3 Value2.G2.B3 Value1.G1.B4 Value2.G1.B4 Value1.G2.B4
1 345 765 761 765 765 875 443 875
2 540 345 325 765 345 765 761 875
3 765 8039 649 765 169 830 975 875
Value2.G2.B4 Value1.G1.Total Value2.G1.Total Value1.G2.Total Value2.G2.Total
1 540 875 325 323 345
2 765 875 443 323 540
3 875 849 323 323 431

最佳答案

使用? reshape

Status <- rep(c(paste0("B",seq(1,4)),"Total"),3)
FID <- c(rep("N123",10),rep("K541",5))
IID <- c(rep(123,5),rep(456,5),rep(789,5))

Value1.G1 <- c(rep(c(888,345,765,875,875,323),2),8039,830,849)
Value2.G1 <- c(rep(c(443,325,761),4),649,975,323)
Value1.G2 <- rep(c(446,345,765,875,323),3)
Value2.G2 <- c(rep(c(540,345,765),4),169,875,431)

dat <-data.frame(FID,IID,Status,Value1.G1,Value2.G1,Value1.G2,Value2.G2)
dat

对于长格式

l <- reshape(dat, direction = 'long', varying = list(c(4,6), c(5,7)),
v.names = c('Value1', 'Value2'), timevar = 'Gel')
l[order(l$Status), ]

# FID IID Status Gel Value1 Value2 id
# 1.1 N123 123 B1 1 888 443 1
# 6.1 N123 456 B1 1 323 761 6
# 11.1 K541 789 B1 1 875 325 11
# 1.2 N123 123 B1 2 446 540 1
# 6.2 N123 456 B1 2 446 765 6
# 11.2 K541 789 B1 2 446 345 11
# 2.1 N123 123 B2 1 345 325 2
# 7.1 N123 456 B2 1 888 443 7
# 12.1 K541 789 B2 1 323 761 12
# 2.2 N123 123 B2 2 345 345 2
# 7.2 N123 456 B2 2 345 540 7
# 12.2 K541 789 B2 2 345 765 12
# 3.1 N123 123 B3 1 765 761 3
# 8.1 N123 456 B3 1 345 325 8
# 13.1 K541 789 B3 1 8039 649 13
# 3.2 N123 123 B3 2 765 765 3
# 8.2 N123 456 B3 2 765 345 8
# 13.2 K541 789 B3 2 765 169 13
# 4.1 N123 123 B4 1 875 443 4
# 9.1 N123 456 B4 1 765 761 9
# 14.1 K541 789 B4 1 830 975 14
# 4.2 N123 123 B4 2 875 540 4
# 9.2 N123 456 B4 2 875 765 9
# 14.2 K541 789 B4 2 875 875 14
# 5.1 N123 123 Total 1 875 325 5
# 10.1 N123 456 Total 1 875 443 10
# 15.1 K541 789 Total 1 849 323 15
# 5.2 N123 123 Total 2 323 345 5
# 10.2 N123 456 Total 2 323 540 10
# 15.2 K541 789 Total 2 323 431 15

和宽

reshape(dat, direction = 'wide', timevar = 'Status', idvar = names(dat)[1:2])

# FID IID Value1.G1.B1 Value2.G1.B1 Value1.G2.B1 Value2.G2.B1 Value1.G1.B2
# 1 N123 123 888 443 446 540 345
# 6 N123 456 323 761 446 765 888
# 11 K541 789 875 325 446 345 323
# Value2.G1.B2 Value1.G2.B2 Value2.G2.B2 Value1.G1.B3 Value2.G1.B3 Value1.G2.B3
# 1 325 345 345 765 761 765
# 6 443 345 540 345 325 765
# 11 761 345 765 8039 649 765
# Value2.G2.B3 Value1.G1.B4 Value2.G1.B4 Value1.G2.B4 Value2.G2.B4 Value1.G1.Total
# 1 765 875 443 875 540 875
# 6 345 765 761 875 765 875
# 11 169 830 975 875 875 849
# Value2.G1.Total Value1.G2.Total Value2.G2.Total
# 1 325 323 345
# 6 443 323 540
# 11 323 323 431

关于重新排列 R 中的数据,分解列名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29437274/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com