【问题标题】:Recast in R gives different valueR中的重铸给出了不同的值
【发布时间】:2019-05-07 10:02:30
【问题描述】:

我在 R 中有以下数据框

  DF2<-data.frame("ID"=c("A", "A", "A", "B", "B", "B", "B", 'B'), 
  'Freq'=c(1,2,3,1,2,3,4,5), "Val"=c(1,2,4, 2,3,4,5,8))

数据框具有以下外观

   ID Freq Val
1  A    1   1
2  A    2   2
3  A    3   4
4  B    1   2
5  B    2   3
6  B    3   4
7  B    4   5
8  B    5   8

我想熔化并重铸数据帧以产生以下数据帧

   A_Freq A_Value B_Freq B_Value
1      1       1      1       2
2      2       2      2       3
3      3       4      3       4
4     NA      NA      4       5
5     NA      NA      5       8

我试过下面的代码

 DF3<-melt(DF2, by=ID)
 DF3$ID<-paste0(DF3$ID, DF3$variable)
 DF3$variable<-NULL
 DF4<-dcast(DF3, value~ID)

这会产生以下数据框

     value AFreq AVal BFreq BVal
 1     1     1    1     1   NA
 2     2     2    2     2    2
 3     3     3   NA     3    3
 4     4    NA    4     4    4
 5     5    NA   NA     5    5
 6     8    NA   NA    NA    8

我怎样才能得到上述结果。我已经尝试过 dcast 的其他变体,但无法获得所需的结果。求人帮忙

【问题讨论】:

    标签: r reshape2 melt dcast


    【解决方案1】:

    一种选择是

    library(tidyverse)
    DF2 %>% 
        gather(key, val, -ID) %>%
        unite(IDkey, ID, key) %>% 
        group_by(IDkey) %>%
        mutate(rn = row_number()) %>% 
        spread(IDkey, val) %>%
        select(-rn)
    # A tibble: 5 x 4
    #  A_Freq A_Val B_Freq B_Val
    #   <dbl> <dbl>  <dbl> <dbl>
    #1      1     1      1     2
    #2      2     2      2     3
    #3      3     4      3     4
    #4     NA    NA      4     5
    #5     NA    NA      5     8
    

    或使用melt/dcast。我们melt,通过将id.var 指定为“ID”(作为字符串)从“宽”格式转换为“长”格式。然后使用dcast,使用表达式rowid(ID, variable) ~ paste(ID, variable, sep="_") 从“长”重塑为“宽”。 rhs~ paste 的列值在一起,而rowid 获取 ID、变量列的序列 id。

    library(data.table)
    dcast(melt(setDT(DF2), id.var = "ID"), rowid(ID, variable) ~ 
         paste(ID, variable, sep="_"))[, ID := NULL][]
    #   A_Freq A_Val B_Freq B_Val
    #1:      1     1      1     2
    #2:      2     2      2     3
    #3:      3     4      3     4
    #4:     NA    NA      4     5
    #5:     NA    NA      5     8
    

    在 OP 的代码中,表达式为 value ~ ID,因此它使用“value”的每个唯一元素创建一个“value”列,同时自动将 value.var 提取为“value”,从而导致多于预期的行数

    【讨论】:

    • 我无法让它工作。错误:row_number() 只能在数据上下文中调用
    • @Raghavanvmvs 你有没有加载tidyverse 包。它对我有用
    • @Raghavanvmvs 是否与您展示的示例相同
    • 是的。相同的例子。它是我经常使用的玩具。
    • @Raghavanvmvs 尝试使用更新的dcast/melt。不知道为什么它不适合你。可能是某些包版本或功能屏蔽?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-20
    • 2018-01-30
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多