Проблемы с расплавом в R

#r #casting #melt

#r #Кастинг #расплав

Вопрос:

Итак, в настоящее время данные выглядят так. Средний столбец — это средняя почасовая заработная плата. Среднее значение — это средняя годовая заработная плата, следовательно, ann в конце. Ввод следует той же логике. Однако, пытаясь сделать его похожим на предполагаемый результат ниже

    ID      mean    meanann    entry     entryann
  32100     100      5200       99         5148
  32101     101      5252      100         5200
  

Предполагаемый результат

     ID      mean    entry
  32100     100      99
  32100     5200     5148
  32101     101      100
  32101     5252     5200
  

Использовал это (https://ademos .people.uic.edu/Chapter8.html ) в качестве учебного пособия, но не нахожу ничего, что делало бы это как таковое. Я знаю, что вы бы выполнили melt и указали свои переменные ID, но проблема в том, что сначала он складывает все мои средние наблюдения, а затем все средние значения и так далее.

Ответ №1:

Вы можете сделать это проще с pivot_longer помощью from tidyr :

 tidyr::pivot_longer(df, 2:5, names_pattern = "^(mean|entry)", names_to = ".value")
#> # A tibble: 4 x 3
#>      ID  mean entry
#>   <int> <int> <int>
#> 1 32100   100    99
#> 2 32100  5200  5148
#> 3 32101   101   100
#> 4 32101  5252  5200
  

Комментарии:

1. Спасибо. Тем не менее, некоторые уточняющие вопросы. {4} .. представляет ли это количество столбцов в оригинале? Кроме того, 2: 5, к чему это относится?

2. "(mean|entry)" может быть лучше и понятнее names_pattern .

3. @TimWilcox 2: 5 — это номера столбцов, содержащих значения. Шаблон names — это регулярное выражение для объединения соответствующих столбцов, которые вы хотите объединить

4. @GregorThomas Вы абсолютно правы. Обновлено, с благодарностью.

Ответ №2:

melt из data.table можно использовать patterns в measure

 library(data.table)
melt(setDT(df), measure = patterns("^mean", "^entry"),
    value.name = c("mean", "entry"))[, variable := NULL][]
#      ID mean entry
#1: 32100  100    99
#2: 32101  101   100
#3: 32100 5200  5148
#4: 32101 5252  5200
  

данные

 df <- structure(list(ID = 32100:32101, mean = 100:101, meanann = c(5200L, 
5252L), entry = 99:100, entryann = c(5148L, 5200L)), 
class = "data.frame", row.names = c(NA, 
-2L))