Я совершенно новичок в любом виде кодирования, не говоря уже о R в частности, поэтому мои дни гугления не очень помогли. Я был бы очень признателен за любую помощь / идеи!

Я хотел бы знать, как получить две новые переменные из исходной переменной и присвоить ей новые значения - в основном я начинаю с этого:

starting point

И хотите получить это:

desired result

Мне удалось получить его в длинном формате с помощью melt(dataname, id.vars=c("ID")), и идентификатор и значение, которые я получаю, хороши. Но есть только одна переменная с моими четырьмя повторяющимися заголовками (loudHot, quietHot,loudCold, quietCold) - как мне создать две новые переменные из этого и присвоить ей значения (например, что "Volume" имеет значение 1, когда исходный переменная имеет значениеloudHot или LoudCold и 0, если это тихий или тихий холод, а затем "Temp" равно 1, если исходная переменная имеет значениеloudHot или quietHot, и 0, если ее громкость или тихий холод)?

2
Bommby 4 Фев 2022 в 15:38
Большое всем спасибо за то, что нашли время, чтобы помочь мне, я очень ценю это, особенно потому, что я не предоставил вам данные должным образом (спасибо, что вы также сообщили мне об этом), так что спасибо за дополнительные шаги!
 – 
Bommby
4 Фев 2022 в 16:49

3 ответа

Я бы не был слишком строг к себе - это не совсем тривиально. В любом случае, вы можете использовать pivot_longer из tidyr и некоторые манипуляции с данными с помощью dplyr для достижения желаемого результата:

library(dplyr)
library(tidyr)

df %>%
  pivot_longer(-ID) %>%
  mutate(Volume = as.numeric(grepl("loud", name)),
         Temp   = as.numeric(grepl("Hot",  name))) %>%
  select(ID, Volume, Temp, value)
#> # A tibble: 32 x 4
#>       ID Volume  Temp value
#>    <dbl>  <dbl> <dbl> <dbl>
#>  1     2      1     1    14
#>  2     2      0     1    16
#>  3     2      1     0    16
#>  4     2      0     0    15
#>  5     4      1     1    19
#>  6     4      0     1    15
#>  7     4      1     0    10
#>  8     4      0     0     8
#>  9     6      1     1    11
#> 10     6      0     1    17
#> # ... with 22 more rows

Данные

df <- data.frame(ID        = (1:8) * 2,
                 loudHot   = c(14, 19, 11, 20, 18, 17, 16, 2),
                 quietHot  = c(16, 15, 17, 5, 10, 10, 15, 0),
                 loudCold  = c(16, 10, 10, 4, 3, 2, 14, 2),
                 quietCold = c(15, 8, 17, 8 ,10, 12, 5, 0))

В качестве совета по любым будущим вопросам SO: не публикуйте изображения данных. Люди здесь должны иметь возможность вырезать и вставлять текст ваших данных, чтобы тестировать и проверять решения. В идеале вы должны сделать это путем вывода функции dput в блок кода. Люди редко прилагают усилия для ручной расшифровки данных с ваших изображений.

Создано 4 февраля 2022 г. с помощью пакета reprex (v2.0.1)

4
Allan Cameron 4 Фев 2022 в 16:11

Чтобы не подходить к своей проблеме с помощью пакетов dplyr и tidyr.

Первая рекомендация для вас — всегда добавлять минимальный воспроизводимый пример ваших данных, чтобы мы могли его использовать и помогать вам быстрее. Это несложно, вы можете использовать dput(head(yourdata, 10)), например, или смоделировать некоторые наблюдения.

Я сделал симуляцию следующим образом:

library(dplyr)
library(tidyr)

data <- data.frame(
  id = 1:5,
  loudHot = sample(10:20, 5, replace = TRUE),
  quieHot = sample(10:20, 5, replace = TRUE),
  loudCold = sample(0:12, 5, replace = TRUE),
  quiteCold = sample(0:12, 5, replace = TRUE)
)

Теперь, когда у нас есть данные, не превращайте их в длинный формат с помощью tidyr::pivot_longer. Эта функция принимает в качестве аргумента кадр данных в широком формате, столбцы, которые вы хотите собрать (или те, которые вы не хотите собирать, используя символ -).

# Data to long format
data_long <- pivot_longer(
  data, cols = -id, 
  names_to = 'variable', values_to = 'value'
  )

При этом теперь вам нужно только создать манекены, что очень просто.

# Adding new variables
data_with_dummy <- mutate(
  data_long,
  volume = as.numeric(variable %in% c('loudHot', "loudCold")),
  temp = as.numeric(variable %in% c('loudHot', "quietCold"))
  )
1
Johan Rosa 4 Фев 2022 в 16:13

Вот базовый подход R:

# Original data
df <- data.frame(
  ID = c(2, 4, 5, 7, 8, 11, 12, 16),
  loudHot = c(14, 19, 11, 20, 18, 17, 16, 2),
  quietHot = c(16, 15, 17, 5, 10, 10, 15, 0),
  loudCold = c(16, 10, 10, 4, 3, 2, 14, 2),
  quietCold = c(15, 8, 17, 8, 10, 12, 5, 0)
)

# Stacked data
df_stacked <- stack(
  df,
  select = c(
    "loudHot", "quietHot", "loudCold", "quietCold"
  )
)

# New variable for volume
df_stacked$Volume <- as.numeric(grepl("loud", df_stacked$ind))

# New variable for Temp
df_stacked$Temp <- as.numeric(grepl("Hot", df_stacked$ind))

# Replace "ind" values with "ID"
df_stacked$ind <- rep(df$ID, times = 4)

# Reorder columns
new_df <- df_stacked[,c(2:4,1)]

# Rename columns
colnames(new_df) <- c("ID", "Volume", "Temp", "Value")

# Order by ID
new_df[order(new_df$ID),]

Я считаю, что ваши столбцы для «Объем» и «Время» должны быть чередующимися последовательностями:

Result of R Code

1
Alexander Christensen 4 Фев 2022 в 17:06