【问题标题】:How to delete first level of headers of a Dataframe in R?如何删除R中数据框的第一级标题?
【发布时间】:2019-04-04 12:39:36
【问题描述】:

我从聚合函数创建了一个数据框。数据帧的长度为 2。但是,当我将数据框打印出来时,会出现 5 列。 R如何处理数据帧中的标题和子标题?如果是这种情况,我该如何摆脱第一级标题?

d <- data.frame("User id"=c(1,1,2,3,1),
                block=c("north","south","east","west","south"), check.names = F)

f <- function(l, vec) {
  vec[l] <- 1
  vec
}

vec <- setNames(rep(0, 4), levels(d$block))
df <- aggregate(block~`User id`, d, f, vec)

这些是让我困惑的输出:

>names(df)
[1] "User id" "block"



> df
  User id block.east block.north block.south block.west
1       1          0           1           1          0
2       2          1           0           0          0
3       3          0           0           0          1

这就是我想要的:

 > names(df)
 > "User id" "block.east" "block.north" "block.south" "block.west"

【问题讨论】:

    标签: r dataframe header aggregate


    【解决方案1】:

    我们可以通过table更轻松地做到这一点

    out <- as.data.frame.matrix(+(table(d) > 0))
    names(df) <- paste0("block.", names(df))
    

    关于 OP 输出中的问题,它是 matrix 列,

    str(df)
    #'data.frame':  3 obs. of  2 variables:
    # $ User id: num  1 2 3
    # $ block  : num [1:3, 1:4] 0 1 0 1 0 0 1 0 0 0 ...
    #   ..- attr(*, "dimnames")=List of 2
    #  .. ..$ : NULL
    #  .. ..$ : chr  "east" "north" "south" "west"
    

    所以我们可以用

    转换成常规的data.frame
    df <- do.call(data.frame, df)
    names(df)
    #[1] "User.id"     "block.east"  "block.north" "block.south" "block.west" 
    
    str(df)
    #'data.frame':  3 obs. of  5 variables:
    # $ User.id    : num  1 2 3
    # $ block.east : num  0 1 0
    # $ block.north: num  1 0 0
    # $ block.south: num  1 0 0
    # $ block.west : num  0 0 1
    

    【讨论】:

      猜你喜欢
      • 2011-11-24
      • 1970-01-01
      • 1970-01-01
      • 2021-05-27
      • 1970-01-01
      • 2016-06-11
      • 1970-01-01
      • 2023-02-07
      • 2022-06-28
      相关资源
      最近更新 更多