#r #dataframe #count #reference
#r #фрейм данных #подсчет #ссылка
Вопрос:
У меня есть сводная таблица, которая является ссылкой на все переменные и возможные значения, содержащиеся в другом фрейме данных. Мне нужно создать новую переменную, которая представляет собой количество значений этих переменных из другого фрейма данных. Вот некоторые примеры данных,
# the dataframe with data I want to count from
Y1 <- c(1,2,3,2,4,4,2,1,2,3,4,3,4,4,4,4,3,2,1,2)
Y2 <- c(1,2,1,2,1,1,2,1,1,2,2,1,2,1,1,1,2,1,2,1)
Y3 <- c(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1)
df <- data.frame(Y1,Y2)
# the summary table with all variables and their possible values
Variable <- c("Y1","Y1","Y1","Y1","Y1","Y2","Y2","Y3", "Y3")
Values <- c(1,2,3,4,5,1,2,1,2)
summary <- data.frame(Variable,Values)
>summary
Variable Values
1 Y1 1
2 Y1 2
3 Y1 3
4 Y1 4
5 Y1 5
6 Y2 1
7 Y2 2
8 Y3 1
9 Y3 2
Сводка содержит имена переменных и все возможные значения. Мне нужно создать переменную с количеством этих переменных и значений из фрейма данных df. Данные примера моделируются так, что Y1 и Y3 не имеют значений для 5 и 2 соответственно.
Я предполагаю, что на словах это будет описано как, new_variable_count[i] в таблице «summary» равно количеству из «df», где (в таблице «summary») переменная [i] = значение [i] .
Некоторый контекст, если это поможет. В вопроснике, в котором людям предлагается оценить что-то 1-5, вы можете не получить ответов на 5 из 5. Возможно значение 5, но если вы запустите таблицу частот переменной, вы просто получите количество значений 1-4. Даже если вы измените данные, возможные значения не будут существовать. Как машина без контекста узнает, какие значения должны существовать. Нулевые значения действительно полезны при анализе 100 переменных, также, если вы не знаете возможный диапазон значений переменной, вы можете ошибочно предположить, что подсчитанные значения являются единственными существующими значениями.
Любая помощь была бы отличной. Любой совет или направление также будут очень полезны, т.Е. Лучше ли использовать цикл? или есть встроенная функция? Заранее большое спасибо.
Комментарии:
1. Работает ли таблица (df $Variable, df $Values)?
Ответ №1:
Надеюсь, я понял ваш вопрос, я совершенно уверен, что уже есть встроенная функция, но понятия не имею, какая из них извините.
Однако решение может быть легко достигнуто с помощью пакета tidyverse и 2 циклов for: сначала вы создаете сводную таблицу
library(tidyverse)
df %>%
pivot_longer(everything(), names_to = "question", values_to = "answer") %>%
group_by(question,answer) %>%
summarise(count = n()) %>%
ungroup()-> test
Затем вы проверяете для каждого вопроса (сначала для цикла), если какой-либо из возможных ответов отсутствует в тестовом df. Если нет, это означает, что существует 0 ответа, и, таким образом, мы добавляем с помощью rbind строку, которая представляет для q вопрос и i возможный ответ, что ответа не было (0).
possible_answers <- 1:5
for(q in colnames(df)){
print(q)
for(i in possible_answers){
if (! i %in% filter(test, question == q)$answer){
print(i)
test %>%
rbind(c(q,i,0)) -> test
}
}
}
окончательная визуализация df:
test %>%
arrange(question,answer)
Я совершенно уверен, что есть более «элегантный» способ выполнить это.
Вы также можете выполнить сводный df с базовыми R-манипуляциями с данными, если вы не хотите использовать пакет tidyverse.
Том
Комментарии:
1. Не совсем, но это дает мне идею! Возможно, это проще, чем я думал. Я могу взять верхнюю часть вашего кода tidyverse. Затем используйте свой «тестовый» df для слияния с итоговым df, используя два столбца обоих фреймов данных в качестве переменной ID. После слияния все, чего нет, будет иметь отсутствующий /NAs, чего я и хотел. Кстати, большое, большое спасибо!