Как удалить первый уровень заголовков Dataframe в R? - PullRequest
1 голос
/ 04 апреля 2019

Я создал фрейм данных из агрегатной функции. Длина фрейма данных равна двум. Однако, когда я печатаю фрейм данных, появляются 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"

1 Ответ

0 голосов
/ 04 апреля 2019

Мы можем сделать это проще с 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
...