【问题标题】:Using the first column for variable names and vice versa with reshape使用第一列作为变量名,反之亦然,重塑
【发布时间】:2020-05-22 09:05:04
【问题描述】:

我的 DF 如下:

library(data.table)
DF <- structure(list(fullname = c(" Returns Count", " Dependent Exemptions Count", 
" Joint Returns Count", " Single Returns Count", " Head of Household Count"
), year = c(1998, 1998, 1998, 1998, 1998), State = c("Alabama", 
"Alabama", "Alabama", "Alabama", "Alabama"), Total_Returns = c(1879778, 
1354776, 774623, 690246, 382183), Breakeven_Loss = c(11649, 4254, 
5365, 5075, 591)), row.names = c(NA, -5L), class = c("data.table", 
"data.frame"))

我想用行名切换第一列,保持状态和年份不变。我尝试了多种方法,其中包括:

valvar <- names(DF)[4:16]
DF<- dcast(DF, year + State ~ fullname, value.var= valvar)

valvar <- names(DF)[4:16]
DF<- dcast(DF, year + State + valvar ~ fullname)

但两者都不起作用。我在这里错过了什么?

期望的输出:

【问题讨论】:

    标签: r data.table reshape2


    【解决方案1】:

    先融化会比较容易:

    library(data.table)
    DF[, melt(.SD, id.vars = c("year", "State", "fullname"))
       ][, dcast(.SD, variable + year + State ~ fullname)]
    
             variable year   State  Dependent Exemptions Count  Head of Household Count  Joint Returns Count  Returns Count  Single Returns Count
    1:  Total_Returns 1998 Alabama                     1354776                   382183               774623        1879778                690246
    2: Breakeven_Loss 1998 Alabama                        4254                      591                 5365          11649                  5075
    

    【讨论】:

    • 非常感谢您的回答。我注意到我仍然遇到麻烦,因为我在值列中有 NA,导致函数默认为长度。是否有任何简单的解决方法(除了删除 NA)?
    • 不知道我是否理解。如果删除 NA 的作品,那将是最好的解决办法,我猜。
    • 好吧,我不希望从数据中删除任何内容,因为数据的不可用性本身就是提供信息的。此外,我想尽可能完整地保留数据,以供其他人复制。
    • 数据集中出现了两次状态..这就是问题..感谢您的帮助!
    【解决方案2】:

    首先获取长格式数据,然后再次更改列名。

    library(tidyr)
    
    DF %>%
      pivot_longer(cols = c(Total_Returns, Breakeven_Loss)) %>%
      pivot_wider(names_from = fullname, values_from = value)
    
    
    # A tibble: 2 x 8
    #   year State  name       ` Returns Count` ` Dependent Exemptions… ` Joint Returns Co… ` Single Returns C… ` Head of Household…
    #  <dbl> <chr>  <chr>                 <dbl>                   <dbl>               <dbl>               <dbl>                <dbl>
    #1  1998 Alaba… Total_Ret…          1879778                 1354776              774623              690246               382183
    #2  1998 Alaba… Breakeven…            11649                    4254                5365                5075                  591
    

    【讨论】:

    • 感谢您的回答!我可以建议 cols = -c(year, State, fullname) 而不是 cols = c(Total_Returns, Breakeven_Loss) 吗?我的实际数据(我怀疑可能会使用它的其他人的数据)比我给出的示例有更多的变量。
    • 您能否向我解释一下,当我抑制此处建议的警告时会发生什么? Warning message: Values in value are not uniquely identified; output will contain list-cols. * Use values_fn = list(value = list) 禁止显示此警告。`
    • 如果您收到该警告,则意味着您的数据没有唯一标识符列可供透视。在这种情况下,您可以只选择相关列并使用DF %&gt;% pivot_longer(cols = -c(year, State, fullname)) %&gt;% group_by(year, state, name) %&gt;% mutate(row = row_number()) %&gt;% pivot_wider(names_from = fullname, values_from = value)
    • 谢谢,是的,你是对的,几个 NA 是造成这种情况的原因。如果我使用您评论中的解决方案,我会收到错误消息:Error: row_number() should only be called in a data context.
    • 我想有一些括号丢失或不完整,这就是您收到错误的原因。尽管这适用于共享的示例数据,但我认为您有太多其他列可能会给您第一个警告。 select 仅在重塑之前的相关列。
    猜你喜欢
    • 1970-01-01
    • 2021-09-28
    • 2012-03-25
    • 1970-01-01
    • 2021-04-26
    • 1970-01-01
    • 2017-09-06
    • 2012-12-06
    • 1970-01-01
    相关资源
    最近更新 更多