R语言 调整数据以将列值拆分为列

ktecyv1j  于 2023-03-27  发布在  其他
关注(0)|答案(7)|浏览(119)
df <- data.frame(animal = c("dog", "dog", "cat", "dog", "cat", "cat"),
                 hunger = c(0, 1, 1, 0, 1,1))

我有一个类似上面的数据框,有两列,一列包含类别,另一列包含二进制数据。
我希望重塑 Dataframe ,将类别(“动物”)列拆分为两列,将“动物”列的值作为列名,将另一列(饥饿)的值作为单元格值,即
预期输出:

df <- data.frame(dog = c(0, 1, 0),
                 cat = c(1, 1, 1))

我怎样才能做到这一点?

km0tfn4u

km0tfn4u1#

在不同类别之间长度不均匀的情况下,我们可以使用

list2DF(
  lapply(
    . <- unstack(df, hunger ~ animal),
    `length<-`,
    max(lengths(.))
  )
)

list2DF(
  lapply(
    . <- unstack(rev(df)),
    `length<-`,
    max(lengths(.))
  )
)

我们将获得

cat dog
1   1   0
2   1   1
3   1   0
4   0  NA

伪数据

df <- data.frame(
  animal = c("dog", "dog", "cat", "dog", "cat", "cat", "cat"),
  hunger = c(0, 1, 1, 0, 1, 1, 0)
)

我们也可以使用unstack,例如:

> unstack(rev(df))
  cat dog
1   1   0
2   1   1
3   1   0

> unstack(df, hunger ~ animal)
  cat dog
1   1   0
2   1   1
3   1   0
p8h8hvxi

p8h8hvxi2#

使用 * 拆分 *:

data.frame(split(df$hunger, df$animal))
#   cat dog
# 1   1   0
# 2   1   1
# 3   1   0
jc3wubiy

jc3wubiy3#

碱基R:

df$id <- ave(df$hunger, df$animal, FUN = seq_along)
reshape(df, idvar = "id", timevar = "animal", direction = "wide")[, -1]

  hunger.dog hunger.cat
1          0          1
2          1          1
4          0          1
dm7nw8vv

dm7nw8vv4#

使用data.table

library(data.table)
dcast(setDT(df), rowid(animal) ~ animal)[, animal  := NULL][]
  • 输出
cat dog
1:   1   0
2:   1   1
3:   1   0
nbysray5

nbysray55#

您可以使用pivot_wider,首先为每个组创建一个id来标识重复项,然后像这样使用names_fromvalues_from

library(dplyr)
library(tidyr)
df %>%
  group_by(animal) %>%
  mutate(id = row_number()) %>%
  pivot_wider(names_from = animal, values_from = hunger) %>%
  select(-id)
#> # A tibble: 3 × 2
#>     dog   cat
#>   <dbl> <dbl>
#> 1     0     1
#> 2     1     1
#> 3     0     1

创建于2023年3月17日,使用reprex v2.0.2

zazmityj

zazmityj6#

一个整洁的框架方式

library(dplyr)
library(tidyr)

df |> 
  pivot_wider(names_from = animal, values_from = hunger, values_fn = list) |> 
  unnest(cols = c("dog", "cat"))

碱基R

do.call(cbind.data.frame, tapply(df$hunger, df$animal, `+`))
cunj1qz1

cunj1qz17#

tidyverse/purrr溶液加入混合物中:

library(tidyverse)

df <- data.frame(animal = c("dog", "dog", "cat", "dog", "cat", "cat"),
                 hunger = c(0, 1, 1, 0, 1,1))

df %>% 
  group_split(animal) %>% 
  map(~tibble(!!quo_name(unique(.x$animal)) := .x$hunger)) %>% 
  list_cbind()
  
#> # A tibble: 3 × 2
#>     cat   dog
#>   <dbl> <dbl>
#> 1     1     0
#> 2     1     1
#> 3     1     0

相关问题