Я совершенно новичок в любом виде кодирования, не говоря уже о R в частности, поэтому мои дни гугления не очень помогли. Я был бы очень признателен за любую помощь / идеи!
Я хотел бы знать, как получить две новые переменные из исходной переменной и присвоить ей новые значения - в основном я начинаю с этого:
И хотите получить это:
Мне удалось получить его в длинном формате с помощью melt(dataname, id.vars=c("ID"))
, и идентификатор и значение, которые я получаю, хороши. Но есть только одна переменная с моими четырьмя повторяющимися заголовками (loudHot, quietHot,loudCold, quietCold) - как мне создать две новые переменные из этого и присвоить ей значения (например, что "Volume" имеет значение 1, когда исходный переменная имеет значениеloudHot или LoudCold и 0, если это тихий или тихий холод, а затем "Temp" равно 1, если исходная переменная имеет значениеloudHot или quietHot, и 0, если ее громкость или тихий холод)?
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)
Чтобы не подходить к своей проблеме с помощью пакетов 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"))
)
Вот базовый подход 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),]
Я считаю, что ваши столбцы для «Объем» и «Время» должны быть чередующимися последовательностями:
Новые вопросы
r
R - это бесплатный язык программирования с открытым исходным кодом и программная среда для статистических вычислений, биоинформатики, визуализации и общих вычислений. Пожалуйста, предоставьте минимальные и воспроизводимые примеры вместе с желаемым результатом. Используйте dput () для данных и укажите все небазовые пакеты с вызовами library (). Не вставляйте изображения для данных или кода, вместо этого используйте блоки кода с отступом. По вопросам, связанным со статистикой, используйте https://stats.stackexchange.com.