【发布时间】:2021-02-16 23:11:39
【问题描述】:
pivot_wider 有以下用例:
我有一个用逗号分隔的字符串的数据集。我想为每个逗号分隔值创建唯一的列,例如采用 1s(存在值)和 0s(不存在值)的虚拟变量。
我可以使用下面显示的方法来做到这一点。但是,我认为这是一种解决方法,因为我需要添加一个带有 value = 1 的列,然后在 pivot_widers values_from 参数中使用它。我尝试使用 values_from = 1 而不先创建新列(我认为 pivot_wider 可以即时创建值),但结果 values_from 使用 tidyeval 并选择第一列。我也尝试过完全不指定参数,但这也不起作用。
有没有更好的方法来使用pivot_wider 而无需为所有行创建一个值为1 的列?由于我确实经常使用这种“解决方法”,我只是想知道是否有更正式的方法可以达到相同的结果。
library(dplyr)
library(tidyr)
# data generating function
create_codes <- function(inp, len) {
size <- round(runif(len, 1, 5))
res <- vapply(seq_len(len),
FUN.VALUE = character(1),
FUN = function(x) {
paste(sample(inp, size[x]), collapse = ", ")
})
}
# toy data
set.seed(123)
dat <- tibble(id = 1:100,
codes = create_codes(10:25, 100))
# transform codes to unique columns
dat %>%
mutate(codes2 = strsplit(codes, ", "),
# can pivot_wider work without this 'workaround' => 'value = 1'?
value = 1) %>%
unnest(codes2) %>%
arrange(codes2) %>%
pivot_wider(names_from = codes2,
names_prefix = "code_",
names_repair = "universal",
values_from = value,
values_fill = 0)
#> # A tibble: 100 x 18
#> id codes code_10 code_11 code_12 code_13 code_14 code_15 code_16 code_17
#> <int> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 11 13, … 1 0 1 1 0 1 0 0
#> 2 13 23, … 1 0 0 0 0 0 0 1
#> 3 25 10, … 1 0 0 1 0 0 0 1
#> 4 30 15, … 1 0 0 0 0 1 0 0
#> 5 37 14, … 1 0 0 0 1 0 1 0
#> 6 47 20, … 1 0 0 0 0 0 0 0
#> 7 59 20, … 1 0 0 0 0 0 0 0
#> 8 60 19, … 1 0 0 0 0 0 0 0
#> 9 66 10, … 1 0 0 0 1 0 0 0
#> 10 67 13, … 1 0 1 1 0 0 0 0
#> # … with 90 more rows, and 8 more variables: code_18 <dbl>, code_19 <dbl>,
#> # code_20 <dbl>, code_21 <dbl>, code_22 <dbl>, code_23 <dbl>, code_24 <dbl>,
#> # code_25 <dbl>
由reprex package (v0.3.0) 于 2021-02-16 创建
【问题讨论】:
-
您期望的代码是什么?应该在
pivot_wider里面。values_from = 1不起作用,因为它需要一个列名 -
@RonakShah:感谢您链接问题并回答如何解决这些问题。但据我所知,我关于如何在没有
mutate(value = 1)的情况下使用pivot_wider的具体问题是,没有在那里讨论。