This question already has answers here:
Reshaping multiple sets of measurement columns (wide format) into single columns (long format)
(7个答案)
2年前关闭。
我有一个这样的数据框:
我想将这个凌乱的表格转换成一个整齐的表格,将所有id为id的药物放在一栏中,并将相应的药物剂量放在一栏中。该表最后应如下所示:
我想这可以通过使用一种重塑功能来实现,该功能可以将数据从宽格式转换为长格式,但是我没有处理。
在这里,“药物”在所有列中都是通用的,因此我们需要创建一个独特的模式。一种方法是指定起始位置(
(7个答案)
2年前关闭。
我有一个这样的数据框:
set.seed(100)
drugs <- data.frame(id = 1:5,
drug_1 = letters[1:5], drug_dos_1 = sample(100,5),
drug_2 = letters[3:7], drug_dos_2 = sample(100,5)
)
id drug_1 drug_dos_1 drug_2 drug_dos_2
1 a 31 c 49
2 b 26 d 81
3 c 55 e 37
4 d 6 f 54
5 e 45 g 17
我想将这个凌乱的表格转换成一个整齐的表格,将所有id为id的药物放在一栏中,并将相应的药物剂量放在一栏中。该表最后应如下所示:
id drug dosage
1 a 31
1 c 49
2 b 26
2 d 81
etc
我想这可以通过使用一种重塑功能来实现,该功能可以将数据从宽格式转换为长格式,但是我没有处理。
最佳答案
一个选项是melt
中的data.table
,它可以在patterns
参数中使用多个measure
library(data.table)
melt(setDT(drugs), measure = patterns('^drug_\\d+$', 'dos'),
value.name = c('drug', 'dosage'))[, variable := NULL][order(id)]
# id drug dosage
#1: 1 a 31
#2: 1 c 49
#3: 2 b 26
#4: 2 d 81
#5: 3 c 55
#6: 3 e 37
#7: 4 d 6
#8: 4 f 54
#9: 5 e 45
#10 5 g 17
在这里,“药物”在所有列中都是通用的,因此我们需要创建一个独特的模式。一种方法是指定起始位置(
^
),后跟'drug'子字符串,然后指定下划线(_
)和字符串结尾(\\d+
)的一个或多个数字($
)。对于“ dos”,只需使用该子字符串来匹配具有“ dos”的列名08-25 00:51