r - 将没有 "timevar"的数据帧从长格式转换为宽格式

标签 r reshape transpose r-faq

我有一个遵循以下长模式的数据框:

   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

通过这个站点,我已经熟悉了 reshape/reshape2 包,并且已经尝试了几次试图让它工作,但到目前为止都失败了。

当我尝试 dcast(dataframe, Name ~ MedName, value.var='MedName')我只是得到一堆作为药物名称标志的列(转置的值是 1 或 0)例如:
 Name  atenolol 25mg  aspirin 81mg
Name1              1             1
Name2              0             0 

我也试过dcast(dataset, Name ~ variable)在我融化数据集之后,这只是吐出以下内容(只计算每个人有多少药物):
 Name  MedName
Name1        3
name2        2

最后,我尝试融合数据,然后使用 idvar="Name" 进行整形。 timevar="variable" (其中所有只是医疗名称),但是这似乎不是为我的问题而构建的,因为如果有多个与 idvar 匹配的内容,那么 reshape 只会采用第一个 MedName 而忽略其余部分。

有谁知道如何使用 reshape 或其他 R 函数来做到这一点?我意识到可能有一种方法可以通过一些 for 循环和条件来以更困惑的方式执行此操作,以基本上拆分和重新粘贴数据,但我希望有一个更简单的解决方案。非常感谢!

最佳答案

这里有一个更短的方法,利用 unlist 的方式处理名称:

library(dplyr)
df1 %>% group_by(Name) %>% do(as_tibble(t(unlist(.[2]))))
# # A tibble: 2 x 4
# # Groups:   Name [2]
#      Name      MedName1       MedName2         MedName3
#     <chr>         <chr>          <chr>            <chr>
#   1 name1 atenolol 25mg   aspirin 81mg sildenafil 100mg
#   2 name2 atenolol 50mg enalapril 20mg             <NA>

关于r - 将没有 "timevar"的数据帧从长格式转换为宽格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11322801/

相关文章:

linux - 如何让 R 使用所有处理器?

r - 在 Rstudio 中使用操作包动态标题和 slider

r - 如何从R中的集群创建newick文件?

c++ - Eigen conservativeResize 奇怪的行为

list - 在 Scala 中是否有一种安全的方法来转置不等长列表的列表?

r - 有没有办法混淆 R 包中的 API key ?

r - 如何将命名向量更改为保留名称的数据框?

r - 如何处理带有双标题的Excel文件

Python - 数据框转置和改变结构

c - 在 .C 中转置 csv