为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

噜噜哒 2019-05-30 12:53:59
在没有“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函数来完成这个任务吗?我意识到,可能有一种更混乱的方式来实现这一点,有些循环和条件线基本上可以拆分和重新粘贴数据,但我希望有一个更简单的解决方案。非常感谢!
查看完整描述

4 回答

?
米脂

TA贡献1836条经验 获得超3个赞

带着数据表包,这可以很容易地解决与新的rowid职能:


library(data.table)

dcast(setDT(d1), 

      Name ~ rowid(Name, prefix = "medication"), 

      value.var = "MedName")

这意味着:


   Name    medication1     medication2       medication3

1 Name1  atenolol 25mg    aspirin 81mg  sildenafil 100mg

2 Name2  atenolol 50mg  enalapril 20mg              <NA>

另一种方法(通常在1.9.7版本之前使用):


dcast(setDT(d1)[, rn := 1:.N, by = Name], 

      Name ~ paste0("medication",rn), 

      value.var = "MedName")

给出同样的结果。


类似的方法,但现在使用dplyr和提尔一揽子:


library(dplyr)

library(tidyr)

d1 %>%

  group_by(Name) %>%

  mutate(rn = paste0("medication",row_number())) %>%

  spread(rn, MedName)

这意味着:


Source: local data frame [2 x 4]

Groups: Name [2]


    Name   medication1    medication2      medication3

  (fctr)         (chr)          (chr)            (chr)

1  Name1 atenolol 25mg   aspirin 81mg sildenafil 100mg

2  Name2 atenolol 50mg enalapril 20mg               NA


查看完整回答
反对 回复 2019-05-30
  • 4 回答
  • 0 关注
  • 707 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信