R 是否更宽/更宽,而不是1的值?

R 是否更宽/更宽,而不是1的值?,r,dplyr,tidyr,R,Dplyr,Tidyr,我想采用一个特性,并将其值以1/0(如果为真/假)的列形式分布,例如 mtcars %>% pivot_wider(names_from = cyl, values_from = 1) 这似乎做了些什么,cyl现在已经扩展到列中,除了值是21、21.4或NA之类的东西 > mtcars %>% + pivot_wider(names_from = cyl, + values_from = 1) # A tib

我想采用一个特性,并将其值以1/0(如果为真/假)的列形式分布,例如

mtcars %>% 
  pivot_wider(names_from = cyl,
              values_from = 1)
这似乎做了些什么,cyl现在已经扩展到列中,除了值是21、21.4或NA之类的东西

> mtcars %>% 
+   pivot_wider(names_from = cyl,
+               values_from = 1)
# A tibble: 32 x 12
    disp    hp  drat    wt  qsec    vs    am  gear  carb   `6`   `4`   `8`
   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
 1  160    110  3.9   2.62  16.5     0     1     4     4  21    NA    NA  
 2  160    110  3.9   2.88  17.0     0     1     4     4  21    NA    NA  
 3  108     93  3.85  2.32  18.6     1     1     4     1  NA    22.8  NA  
 4  258    110  3.08  3.22  19.4     1     0     3     1  21.4  NA    NA  
 5  360    175  3.15  3.44  17.0     0     0     3     2  NA    NA    18.7
 6  225    105  2.76  3.46  20.2     1     0     3     1  18.1  NA    NA  
 7  360    245  3.21  3.57  15.8     0     0     3     4  NA    NA    14.3
 8  147.    62  3.69  3.19  20       1     0     4     2  NA    24.4  NA  
 9  141.    95  3.92  3.15  22.9     1     0     4     2  NA    22.8  NA  
10  168.   123  3.92  3.44  18.3     1     0     4     4  19.2  NA    NA 
根据cyl是4、6还是8,如何将cyl分布在二进制值为1或0的列上


pivot_加宽()是我想要的吗?

mpg
设置为1,并将
mpg
的填充设置为0,如下所示:

mtcars %>%
  mutate(mpg = 1) %>%
  pivot_wider(names_from = cyl, values_from = mpg, values_fill = list(mpg = 0))
## # A tibble: 32 x 12
##     disp    hp  drat    wt  qsec    vs    am  gear  carb   `6`   `4`   `8`
##    <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
##  1  160    110  3.9   2.62  16.5     0     1     4     4     1     0     0
##  2  160    110  3.9   2.88  17.0     0     1     4     4     1     0     0
##  3  108     93  3.85  2.32  18.6     1     1     4     1     0     1     0
## ... etc ...
mtcars %>%
  pivot_wider(names_from = cyl, values_from = mpg, 
    values_fn = list(mpg = ~ 1), values_fill = list(mpg = 0))
## # A tibble: 32 x 12
##     disp    hp  drat    wt  qsec    vs    am  gear  carb   `6`   `4`   `8`
##    <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
##  1  160    110  3.9   2.62  16.5     0     1     4     4     1     0     0
##  2  160    110  3.9   2.88  17.0     0     1     4     4     1     0     0
##  3  108     93  3.85  2.32  18.6     1     1     4     1     0     1     0
## ...etc...
或者指定如下值_fn:

mtcars %>%
  mutate(mpg = 1) %>%
  pivot_wider(names_from = cyl, values_from = mpg, values_fill = list(mpg = 0))
## # A tibble: 32 x 12
##     disp    hp  drat    wt  qsec    vs    am  gear  carb   `6`   `4`   `8`
##    <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
##  1  160    110  3.9   2.62  16.5     0     1     4     4     1     0     0
##  2  160    110  3.9   2.88  17.0     0     1     4     4     1     0     0
##  3  108     93  3.85  2.32  18.6     1     1     4     1     0     1     0
## ... etc ...
mtcars %>%
  pivot_wider(names_from = cyl, values_from = mpg, 
    values_fn = list(mpg = ~ 1), values_fill = list(mpg = 0))
## # A tibble: 32 x 12
##     disp    hp  drat    wt  qsec    vs    am  gear  carb   `6`   `4`   `8`
##    <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
##  1  160    110  3.9   2.62  16.5     0     1     4     4     1     0     0
##  2  160    110  3.9   2.88  17.0     0     1     4     4     1     0     0
##  3  108     93  3.85  2.32  18.6     1     1     4     1     0     1     0
## ...etc...
mtcars%>%
枢轴宽度(名称=气缸,值=mpg,
值\u fn=list(mpg=~1),值\u fill=list(mpg=0))
###A tible:32 x 12
##显示hp drat wt qsec与am齿轮carb`6``4``8`
##               
##  1  160    110  3.9   2.62  16.5     0     1     4     4     1     0     0
##  2  160    110  3.9   2.88  17.0     0     1     4     4     1     0     0
##  3  108     93  3.85  2.32  18.6     1     1     4     1     0     1     0
##……等等。。。

一个选项是使用
cyl
中的名称和值,然后根据
is.na重新编码:

mtcars %>% 
  pivot_wider(names_from = cyl,
              values_from = cyl) %>% 
  mutate_at(vars(!!!syms(as.character(unique(mtcars$cyl)))), ~if_else(is.na(.), 0, 1))

# A tibble: 32 x 13
#     mpg  disp    hp  drat    wt  qsec    vs    am  gear  carb   `6`   `4`   `8`
#   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1  21    160    110  3.9   2.62  16.5     0     1     4     4     1     0     0
# 2  21    160    110  3.9   2.88  17.0     0     1     4     4     1     0     0
# 3  22.8  108     93  3.85  2.32  18.6     1     1     4     1     0     1     0
# 4  21.4  258    110  3.08  3.22  19.4     1     0     3     1     1     0     0
# 5  18.7  360    175  3.15  3.44  17.0     0     0     3     2     0     0     1
# 6  18.1  225    105  2.76  3.46  20.2     1     0     3     1     1     0     0
# 7  14.3  360    245  3.21  3.57  15.8     0     0     3     4     0     0     1
# 8  24.4  147.    62  3.69  3.19  20       1     0     4     2     0     1     0
# 9  22.8  141.    95  3.92  3.15  22.9     1     0     4     2     0     1     0
#10  19.2  168.   123  3.92  3.44  18.3     1     0     4     4     1     0     0
mtcars%>%
枢轴(名称从=气缸,
值_from=cyl)%>%
在(vars(!!!syms)(as.character(unique(mtcars$cyl))),~if_-else(is.na(.),0,1))处进行变异
#一个tibble:32x13
#mpg显示hp drat wt qsec与am齿轮carb`6``4``8`
#               
# 1  21    160    110  3.9   2.62  16.5     0     1     4     4     1     0     0
# 2  21    160    110  3.9   2.88  17.0     0     1     4     4     1     0     0
# 3  22.8  108     93  3.85  2.32  18.6     1     1     4     1     0     1     0
# 4  21.4  258    110  3.08  3.22  19.4     1     0     3     1     1     0     0
# 5  18.7  360    175  3.15  3.44  17.0     0     0     3     2     0     0     1
# 6  18.1  225    105  2.76  3.46  20.2     1     0     3     1     1     0     0
# 7  14.3  360    245  3.21  3.57  15.8     0     0     3     4     0     0     1
# 8  24.4  147.    62  3.69  3.19  20       1     0     4     2     0     1     0
# 9  22.8  141.    95  3.92  3.15  22.9     1     0     4     2     0     1     0
#10  19.2  168.   123  3.92  3.44  18.3     1     0     4     4     1     0     0

values\u from=1
获取第一列的值,即
mpg
。21、21.4等,您看到的是来自
mpg
!!!因此,就像从
cyl
中生成虚拟变量一样,一些似乎相关的帖子:,虽然我正在更广泛地阅读pivot\u的文档页面,但我发现这很难理解:
values\u fn=list(mpg=~1),values\u fill=list(mpg=0)
。那里到底发生了什么?尤其是被tilde ~
值所迷惑的\u fn
采用了一个命名列表,其中的名称是要使用的列名。在本例中,我们希望将函数应用于
mpg
列中的每个值,因此我们将其用作名称
~1
函数(x)1
的缩写,即返回1的函数。许多tidyverse函数都支持这种表示法。