猿问

在没有“timevar”的情况下,将数据从长格式转到宽格式

在没有“timevar”的情况下,将数据从长格式转到宽格式

我有一个如下长模式的数据框架:

   Name          MedName
  Name1    atenolol 25mg
  Name1     aspirin 81mg
  Name1 sildenafil 100mg
  Name2    atenolol 50mg
  Name2   enalapril 20mg

并且希望得到下面的内容(我不在乎是否可以这种方式命名列,只想要这种格式的数据):

   Name   medication1    medication2      medication3
  Name1 atenolol 25mg   aspirin 81mg sildenafil 100mg
  Name2 atenolol 50mg enalapril 20mg             NA

通过这个网站,我已经熟悉了重塑/重塑2包,并经历了几次尝试,试图让它发挥作用,但到目前为止已经失败了。

当我尝试dcast(dataframe, Name ~ MedName, value.var='MedName')我只得到一堆列,它们是药物名称的标志(被转置的值是1或0)示例:

 Name  atenolol 25mg  aspirin 81mg
Name1              1             1Name2              0             0

我也试过dcast(dataset, Name ~ variable)但是,在我融化了数据集之后,它只会输出以下内容(只计算每个人有多少种药物):

 Name  MedName
Name1        3name2        2

最后,我试图融化数据,然后使用idvar="Name" timevar="variable"(其中所有的都是Medname),但是这似乎不是为我的问题构建的,因为如果idvar有多个匹配项,则RESTPE只会使用第一个MedName,而忽略其余的。

有人知道如何使用重塑或其他R函数来完成这个任务吗?我意识到,可能有一种更混乱的方式来实现这一点,有些循环和条件线基本上可以拆分和重新粘贴数据,但我希望有一个更简单的解决方案。非常感谢!


噜噜哒
浏览 708回答 4
4回答

米脂

带着数据表包,这可以很容易地解决与新的rowid职能:library(data.table)dcast(setDT(d1),&nbsp;&nbsp; &nbsp; &nbsp; Name ~ rowid(Name, prefix = "medication"),&nbsp;&nbsp; &nbsp; &nbsp; value.var = "MedName")这意味着:&nbsp; &nbsp;Name&nbsp; &nbsp; medication1&nbsp; &nbsp; &nbsp;medication2&nbsp; &nbsp; &nbsp; &nbsp;medication31 Name1&nbsp; atenolol 25mg&nbsp; &nbsp; aspirin 81mg&nbsp; sildenafil 100mg2 Name2&nbsp; atenolol 50mg&nbsp; enalapril 20mg&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <NA>另一种方法(通常在1.9.7版本之前使用):dcast(setDT(d1)[, rn := 1:.N, by = Name],&nbsp;&nbsp; &nbsp; &nbsp; Name ~ paste0("medication",rn),&nbsp;&nbsp; &nbsp; &nbsp; value.var = "MedName")给出同样的结果。类似的方法,但现在使用dplyr和提尔一揽子:library(dplyr)library(tidyr)d1 %>%&nbsp; group_by(Name) %>%&nbsp; mutate(rn = paste0("medication",row_number())) %>%&nbsp; spread(rn, MedName)这意味着:Source: local data frame [2 x 4]Groups: Name [2]&nbsp; &nbsp; Name&nbsp; &nbsp;medication1&nbsp; &nbsp; medication2&nbsp; &nbsp; &nbsp; medication3&nbsp; (fctr)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(chr)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (chr)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (chr)1&nbsp; Name1 atenolol 25mg&nbsp; &nbsp;aspirin 81mg sildenafil 100mg2&nbsp; Name2 atenolol 50mg enalapril 20mg&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;NA
随时随地看视频慕课网APP
我要回答