【问题标题】:Transpose of data.frame turns first row into a listdata.frame 的转置将第一行变成一个列表
【发布时间】:2020-05-21 13:03:07
【问题描述】:

我的数据如下:

library(data.table)
DF <- structure(list(toberevised = c("Number of returns", "Number of joint returns", 
"Number with paid preparer's signature"), `SOUTH DAKOTA_All returns` = c(135257620, 
52607676, 80455243), `SOUTH DAKOTA_Under_50000` = c(92150166, 
20743943, 53622647)), row.names = c(NA, -3L), class = c("data.table", 
"data.frame"))

我想将第一列作为变量,并将变量放在一列中,所以我这样做了:

DF<- as.data.frame(t(DF))
setnames(DF, DF[1,])

然后我得到错误:

Passed a vector of type 'list'. Needs to be type 'character'

我已经尝试了所有我能想到的取消列表的方法,但无济于事。

我在这里做错了什么?

【问题讨论】:

  • 试试unlist(DF[1,])。所以应该这样做setNames(DF, unlist(DF[1,]))
  • 想要的输出不清楚,但我猜是transpose(DF, make.names = "toberevised"),其中'DF'是原始DF。
  • @Sotos setNames(DF, unlist(DF[1,])) 成功了!只是以某种方式取消上市并没有。知道是什么原因造成的吗?
  • @Henrik 我在使用您的解决方案时遇到错误。 Error in transpose(DF, make.names = "toberevised") : unused argument (make.names = "toberevised")
  • 哦...好吧,您不能真正取消列出某些内容并将其保存在数据框中。请记住,数据框是列表

标签: r dataframe matrix transpose


【解决方案1】:

转置 data.frame 很危险,因为 t() 返回一个矩阵,其中所有元素(“单元格”)都被强制转换为相同的数据类型:

t(DF)
                         [,1]                [,2]                      [,3]                                   
toberevised              "Number of returns" "Number of joint returns" "Number with paid preparer's signature"
SOUTH DAKOTA_All returns "135257620"         " 52607676"               " 80455243"                            
SOUTH DAKOTA_Under_50000 "92150166"          "20743943"                "53622647"

现在,所有数值都被强制输入了原本不应该的字符。

前面多次提到herehere,我建议将数据reshape成整齐的格式,即长格式,以简化数据处理:

library(data.table)
long <- melt(DF, id.vars = "toberevised")
long
                             toberevised                 variable     value
1:                     Number of returns SOUTH DAKOTA_All returns 135257620
2:               Number of joint returns SOUTH DAKOTA_All returns  52607676
3: Number with paid preparer's signature SOUTH DAKOTA_All returns  80455243
4:                     Number of returns SOUTH DAKOTA_Under_50000  92150166
5:               Number of joint returns SOUTH DAKOTA_Under_50000  20743943
6: Number with paid preparer's signature SOUTH DAKOTA_Under_50000  53622647

从长格式,我们可以重塑成想要的宽格式:

dcast(long, variable ~ toberevised) 
                   variable Number of joint returns Number of returns Number with paid preparer's signature
1: SOUTH DAKOTA_All returns                52607676         135257620                              80455243
2: SOUTH DAKOTA_Under_50000                20743943          92150166                              53622647

现在,数字仍然是数字类型。


根据经验,每当将列名视为属性时,例如SOUTH DAKOTA_Under_50000,数据很可能不是整齐的格式。属性应作为数据项进行存储和处理,以便将其用于子集、分组和聚合。

其实SOUTH DAKOTA_Under_50000包含两个属性,一个区域和一个分类。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-24
    • 2019-10-27
    相关资源
    最近更新 更多