R语言 将列表列转换为二进制列

pkln4tw6  于 2023-02-06  发布在  其他
关注(0)|答案(3)|浏览(155)

我有一个R数据框,其中的列如下所示

codes
111:222:333
222
111:222

我想将codes列展开为单个二进制列,如下所示:

111 222 333
1   1   1
0   1   0
1   1   0

我尝试使用strsplitcodes列转换为字符列表,然后取消嵌套codes列并希望执行pivot_wider,但似乎无法对具有重复标识列的列执行此操作。

df <- df %>% 
  mutate(codes = strsplit(codes, ":", TRUE))
  unnest(codes) %>%
  mutate(value = 1) %>%
  pivot_wider(names_from = codes,
                         values_from = value,
                         values_fill = 0)
92vpleto

92vpleto1#

使用separate_rows的另一种方法:

library(tidyr)
library(dplyr)

df1 %>%
  mutate(r = 1:n()) %>%
  separate_rows(., codes, sep=":") %>% 
  table %>% 
  t

#   codes
# r   111 222 333
#   1   1   1   1
#   2   0   1   0
#   3   1   1   0

虽然这会给予我们一个表,所以如果我们需要一个 Dataframe ,我们应该使用pivot_wider而不是table

df1 %>%
  mutate(r = 1:n(), val = 1) %>%
  separate_rows(., codes, sep=":") %>%
  pivot_wider(names_from = "codes", values_from = "val", values_fill = 0) %>%
  select(-r)

# # A tibble: 3 x 3
#  `111` `222` `333`
#  <dbl> <dbl> <dbl>
# 1    1     1     1
# 2    0     1     0
# 3    1     1     0

数据:

df1 <- data.frame(codes = c("111:222:333","222", "111:222"))
9ceoxa92

9ceoxa922#

id列添加到unnest之前的 Dataframe 中

library(dplyr)
library(tidyr)

df %>% 
  mutate(codes = strsplit(codes, ":", TRUE)) |>
  mutate(id = row_number()) |>
  unnest(codes) |>
  mutate(value = 1) %>%
  pivot_wider(names_from = codes,
                         values_from = value,
                         values_fill = 0)

##> + # A tibble: 3 × 4
##>      id `111` `222` `333`
##>   <int> <dbl> <dbl> <dbl>
##> 1     1     1     1     1
##> 2     2     0     1     0
##> 3     3     1     1     0
hmae6n7t

hmae6n7t3#

我们可以从fastDummies使用dummy_cols

library(fastDummies)
dummy_cols(df1, "codes", split = ":", remove_selected_columns = TRUE)
  • 输出
codes_111 codes_222 codes_333
1         1         1         1
2         0         1         0
3         1         1         0

注意:列名以字母开头可能更好。如果我们只想使用值

library(dplyr)
library(stringr)
dummy_cols(df1, "codes", split = ":", remove_selected_columns = TRUE)  %>% 
  setNames(str_remove(names(.), "codes_"))
   111 222 333
1   1   1   1
2   0   1   0
3   1   1   0

数据

df1 <- structure(list(codes = c("111:222:333", "222", "111:222")),
class = "data.frame", row.names = c(NA, 
-3L))

相关问题