【问题标题】:Making long format selectively pivot_longer() tidyverse in R在 R 中选择性地使长格式 pivot_longer() tidyverse
【发布时间】:2021-01-19 03:30:48
【问题描述】:

我正在尝试将我的 data.frame (d) 中的 4 个变量 (id, uerate, lnw, exper) 转换为长格式。

我还想添加两个二进制 (0/1) 列,分别称为 DLDE;如果长格式的value 代表lnw,则DL==1DE==0 反之亦然。

我想知道如何正确指定tidyr::pivot_longer() 以获得下面的预期输出?

d <- read.csv("https://stats.idre.ucla.edu/wp-content/uploads/2016/02/wages_pp-1.txt")

select(d, id, uerate, lnw, exper) %>% pivot_longer(everything()) # tried without success

#### EXPECTED OUTPUT:

##      id uerate variable value DE DL
## 1    31   3.21      lnw 1.491  0  1
## 2    31   3.21      lnw 1.433  0  1
## 3    31   3.21      lnw 1.469  0  1
## 4    31   3.29      lnw 1.749  0  1
## 5    31   2.90      lnw 1.931  0  1
## 6    31   2.50      lnw 1.709  0  1
## 7    31   2.60      lnw 2.086  0  1
## 8    31   4.79      lnw 2.129  0  1
## 6403 31   3.21    exper 0.015  1  0
## 6404 31   3.21    exper 0.715  1  0
## 6405 31   3.21    exper 1.734  1  0
## 6406 31   3.29    exper 2.773  1  0
## 6407 31   2.90    exper 3.927  1  0
## 6408 31   2.50    exper 4.946  1  0
## 6409 31   2.60    exper 5.965  1  0
## 6410 31   4.79    exper 6.984  1  0

【问题讨论】:

    标签: r function dataframe dplyr tidyverse


    【解决方案1】:

    我们select 感兴趣的列,而不是cols 选择的列中的everything(),它应该选择'id'、'uerate' (-c(id, uerate)) 以外的列,然后选择@987654325 @ 创建新列 'DE' 和 'DL'

    library(dplyr)
    library(tidyr)
    d %>%
       select(id, uerate, lnw, exper) %>% 
       pivot_longer(cols = -c(id, uerate), names_to = 'variable') %>% 
       mutate(DE = +(variable == 'exper'), DL =  +(!DE)) %>%
       arrange(id, variable)
    

    -输出

    # A tibble: 12,804 x 6
    #      id uerate variable value    DE    DL
    #   <int>  <dbl> <chr>    <dbl> <int> <int>
    # 1    31   3.22 exper    0.015     1     0
    # 2    31   3.22 exper    0.715     1     0
    # 3    31   3.22 exper    1.73      1     0
    # 4    31   3.30 exper    2.77      1     0
    # 5    31   2.90 exper    3.93      1     0
    # 6    31   2.50 exper    4.95      1     0
    # 7    31   2.60 exper    5.96      1     0
    # 8    31   4.80 exper    6.98      1     0
    # 9    31   3.22 lnw      1.49      0     1
    #10    31   3.22 lnw      1.43      0     1
    # … with 12,794 more rows
    

    【讨论】:

    • @rnorouzian 只是将类型从逻辑强制转换为整数,因为 + 在不同语言中具有相同的强制效果。即逻辑是TRUE/FALSE,内部是1/0。可以使用+ 或更明确的as.integer 将其转换为二进制表示
    猜你喜欢
    • 1970-01-01
    • 2022-11-15
    • 1970-01-01
    • 2020-08-28
    • 1970-01-01
    • 1970-01-01
    • 2019-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多