仅对 R 中的某些列使用 melt
Using melt only for certain columns in R
下面是示例数据。 pct10、pct25、median 和 pct75 是小时工资。他们下面的同行是年薪。难题是如何在复制描述性项目的同时基本上只折叠下面的这些;行业和职业。期望的结果如下。 Ratetype 将是一个新的 field/column,其中 1 代表每小时,4 代表每年。我以前的尝试导致创建的行太多。在这种情况下,最终结果将是 4 original * 2。
首先,融化是解决这个问题的最佳方法吗?
其次,是否像 occmelt2<- melt(occmelt, id.vars = c()) 一样简单,只需指定正确的 Id 变量
industry<-c(000000,000000,000000,000000)
occupation<-c(110000,120000,130000,140000)
pct10 <-c(11,15,26.25,19.50)
pct25 <-c(13,14.50,15.65,15.95)
median <-c(22,22.50,23.50,29)
pct75<-c(24,23.75,22,26.50)
Annualpct10 <-c(44000,45000,46000,49000)
Annualpct25 <-c(48000,49000,52000,54000)
Annualmedian <-c(54000,55000,56700,59800)
Annualpct75 <-c(64000,65000,71000,72700)
occmelt <- data.frame(industry,occupation,pct10,pct25,median,pct75,Annualpct10,Annualpct25,Annualmedian,Annualpct75)
industry occupation rateype pct10 pct25 median pct75
000000 110000 1 11 13 22 24
000000 110000 4 44000 48000 54000 54000
000000 120000 1 15 14.50 22.5 23.75
000000 120000 4 45000 49000 55000 65000
下面是一个带有pivot_longer
的选项
- 重命名以 'pct' 或 'median' 开头的列以添加前缀 'Hourly'
- 使用
pivot_longer
和 names_sep
在字符和 'pct' 或 'median' 之间拆分
- 然后,
recode
将'Hourly'、'Annual'分别设为1和4
library(dplyr)
library(tidyr)
library(stringr)
occmelt %>%
rename_with(~ str_c('Hourly', .), matches('^(pct|median)')) %>%
pivot_longer(cols = matches('pct|median'),
names_to = c('ratetype', '.value'),
names_sep = "(?<=.)(?=(pct|median))") %>%
mutate(ratetype = recode(ratetype, Hourly = "1", Annual = "4"))
-输出
# A tibble: 8 x 7
industry occupation ratetype pct10 pct25 median pct75
<dbl> <dbl> <chr> <dbl> <dbl> <dbl> <dbl>
1 0 110000 1 11 13 22 24
2 0 110000 4 44000 48000 54000 64000
3 0 120000 1 15 14.5 22.5 23.8
4 0 120000 4 45000 49000 55000 65000
5 0 130000 1 26.2 15.6 23.5 22
6 0 130000 4 46000 52000 56700 71000
7 0 140000 1 19.5 16.0 29 26.5
8 0 140000 4 49000 54000 59800 72700
下面是示例数据。 pct10、pct25、median 和 pct75 是小时工资。他们下面的同行是年薪。难题是如何在复制描述性项目的同时基本上只折叠下面的这些;行业和职业。期望的结果如下。 Ratetype 将是一个新的 field/column,其中 1 代表每小时,4 代表每年。我以前的尝试导致创建的行太多。在这种情况下,最终结果将是 4 original * 2。
首先,融化是解决这个问题的最佳方法吗?
其次,是否像 occmelt2<- melt(occmelt, id.vars = c()) 一样简单,只需指定正确的 Id 变量
industry<-c(000000,000000,000000,000000)
occupation<-c(110000,120000,130000,140000)
pct10 <-c(11,15,26.25,19.50)
pct25 <-c(13,14.50,15.65,15.95)
median <-c(22,22.50,23.50,29)
pct75<-c(24,23.75,22,26.50)
Annualpct10 <-c(44000,45000,46000,49000)
Annualpct25 <-c(48000,49000,52000,54000)
Annualmedian <-c(54000,55000,56700,59800)
Annualpct75 <-c(64000,65000,71000,72700)
occmelt <- data.frame(industry,occupation,pct10,pct25,median,pct75,Annualpct10,Annualpct25,Annualmedian,Annualpct75)
industry occupation rateype pct10 pct25 median pct75
000000 110000 1 11 13 22 24
000000 110000 4 44000 48000 54000 54000
000000 120000 1 15 14.50 22.5 23.75
000000 120000 4 45000 49000 55000 65000
下面是一个带有pivot_longer
- 重命名以 'pct' 或 'median' 开头的列以添加前缀 'Hourly'
- 使用
pivot_longer
和names_sep
在字符和 'pct' 或 'median' 之间拆分
- 然后,
recode
将'Hourly'、'Annual'分别设为1和4
library(dplyr)
library(tidyr)
library(stringr)
occmelt %>%
rename_with(~ str_c('Hourly', .), matches('^(pct|median)')) %>%
pivot_longer(cols = matches('pct|median'),
names_to = c('ratetype', '.value'),
names_sep = "(?<=.)(?=(pct|median))") %>%
mutate(ratetype = recode(ratetype, Hourly = "1", Annual = "4"))
-输出
# A tibble: 8 x 7
industry occupation ratetype pct10 pct25 median pct75
<dbl> <dbl> <chr> <dbl> <dbl> <dbl> <dbl>
1 0 110000 1 11 13 22 24
2 0 110000 4 44000 48000 54000 64000
3 0 120000 1 15 14.5 22.5 23.8
4 0 120000 4 45000 49000 55000 65000
5 0 130000 1 26.2 15.6 23.5 22
6 0 130000 4 46000 52000 56700 71000
7 0 140000 1 19.5 16.0 29 26.5
8 0 140000 4 49000 54000 59800 72700