This question already has answers here:
Reshaping multiple sets of measurement columns (wide format) into single columns (long format)

(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