【问题标题】:unmelt data of data values for groups [duplicate]组数据值的未融化数据[重复]
【发布时间】:2018-09-02 17:10:15
【问题描述】:

我正在尝试解开一个带有变量的大表。 这个帖子只给了我提示,但没有解决我的问题 (How to "unmelt" data with reshape r)。

我想从这里出发:

name1   name2   values  group
xyz1    abc1    1   group1
xyz2    ghf 2   group2
xyz3    lmn 3   group1
xyz4    opq 4   group2
xyz1    abc1    5   group2
xyz2    ghf 6   group1
xyz3    lmn 7   group2
xyz4    opq 8   group1
xyz5    stu 2   group3

到

name1   name2   group_1 gruoup_2    group_3
xyz1    abc1    1   6   NA
xyz2    ghf33   6   2   NA
xyz3    lmn93   3   5   NA
xyz4    opq42   8   4   NA
xyz5    stu21   NA  NA  2

我当前的“unmelt”命令是

d <- read.table("test.txt", header=T, sep="\t")
e <- dcast(d, name1 + name2 ~ group ~ values)

但这不会将值分配给组和 name1 和 name2 如果你能帮助我,那就太好了。 太感谢了! D

【问题讨论】:

  • 使用data.table:dcast(dat, name1 + name2 ~ group, value.var="values")。
  • dcast(dat, name1+name2~group, value.var="values") 对我有用(使用 data.table 的 dcast)
  • 要在基础 R 中执行此操作,您可以像这样使用 reshape reshape(dat, direction="wide", idvar=c("name1", "name2"), timevar="group")。
  • 这是一个非常接近的电话,但你对我的投票表示赞成,因为我提醒用户注意这个多功能但棘手的(阅读令人抓狂)功能。
  • @MauritsEvers (soapbox) 作为个人喜好,我尽量避免使用“诗句”。请注意,您提到了dplyr::spread,而答案提到了tydyr::spread。我通常在包受限的环境中工作,有时在添加包时遇到困难。此外,我还记得gglot2 的一个不断变化的界面,而我的一些编程选择很糟糕,需要 5 多个小时来调整脚本以适应新版本。另一位前任请参阅data.frame to list 中的讨论。

标签: r reshape melt


【解决方案1】:

你可以使用base R的reshape:

reshape(df, idvar = c("name2", "name1"), timevar = "group", direction = "wide")
#  name1 name2 values.group1 values.group2 values.group3
#1  xyz1  abc1             1             5            NA
#2  xyz2   ghf             6             2            NA
#3  xyz3   lmn             3             7            NA
#4  xyz4   opq             8             4            NA
#9  xyz5   stu            NA            NA             2

或者使用reshape2::dcast:

reshape2::dcast(df, name1 + name2 ~ group, value.var = "values");
#  name1 name2 group1 group2 group3
#1  xyz1  abc1      1      5     NA
#2  xyz2   ghf      6      2     NA
#3  xyz3   lmn      3      7     NA
#4  xyz4   opq      8      4     NA
#5  xyz5   stu     NA     NA      2

样本数据

df <- read.table(text =
    "name1   name2   values  group
xyz1    abc1    1   group1
xyz2    ghf 2   group2
xyz3    lmn 3   group1
xyz4    opq 4   group2
xyz1    abc1    5   group2
xyz2    ghf 6   group1
xyz3    lmn 7   group2
xyz4    opq 8   group1
xyz5    stu 2   group3", header = T)

【讨论】:

  • 非常感谢。它似乎工作。但计算已经需要 10 分钟。重复(见下面我的评论)重要吗?
  • @Dennis 试试reshape2::dcast 选项。不确定受骗。也许更新您的示例数据以包含其中一些重复条目?
  • @Dennis 另请参阅this post,了解更多关于如何从长变宽的选项。
  • 明天去看看。 dcast 给了我一个错误:聚合函数丢失:默认长度和值总是只有“1”
  • @Dennis 你确定你使用的是reshape2::dcast吗?我给出的示例肯定适用于示例数据。
【解决方案2】:

您可以在tidyr 中使用spread。那是

spread(my_data, group, values)

有关spread 的其他示例,请参阅here

【讨论】:

  • 非常感谢您的帮助。扩展函数导致此错误:#Error: Duplicate identifiers for rows (3046, 3051), (3715, 3718), (3737, 3738), (5379, 5380), (5983, 5984), (7919, 7932) , (9610, 9611, 9612), (10177, 10192), (10595, 10597), (11082, 11083), (11568, 11569), (12209, 12210), (12530, 12532), (12815, 12819) , (12834, 12835), (14172, 14173), (14267, 14272), (15134, 15135), (16643, 16644), .....有什么办法可以解决这个问题吗?不过谢谢。 D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-18
  • 1970-01-01
  • 2017-03-30
相关资源
最近更新 更多