Как перебрать подмножество столбцов во фрейме данных для создания новых переменных
У меня есть несколько наборов данных, состоящих из ~250 переменных на 350-600 фермерских хозяйств в разных регионах. Данные очень грязные и представляют многочисленные проблемы для анализа. Я новичок в R, поэтому любая помощь по нижеуказанному будет принята с благодарностью.
Первоначально несколько столбцов содержали несколько переменных, например столбец "Входы", содержащий до 4 отдельных входов (удобрения, гербициды, пестициды и гибридные семена). Я использовал spread()
функция в tidyr
создать 4 новые переменные (Input_1... Input_4). Получающиеся новые переменные "Входные данные" выглядят как следующий имитированный фрейм данных, в котором каждая строка представляет отдельное хозяйство фермы:
Input_1 <- c("Fertilisers", "Fertilisers", "Fertilisers", "Fertilisers", NA)
Input_2 <- c("Hybrid_Seeds", "Hybrid_Seeds", "Pesticides", "Herbicides", NA)
Input_3 <- c(NA, NA, NA, "Pesticides", NA)
Input_4 <- c(NA, NA, NA, "Hybrid_Seeds", NA)
x <- data.frame(Input_1, Input_2, Input_3, Input_4)
x
Input_1 Input_2 Input_3 Input_4
1 Fertilisers Hybrid_Seeds <NA> <NA>
2 Fertilisers Hybrid_Seeds <NA> <NA>
3 Fertilisers Pesticides <NA> <NA>
4 Fertilisers Herbicides Pesticides Hybrid_Seeds
5 <NA> <NA> <NA> <NA>
Что я надеюсь сделать, так это перебрать все эти недавно созданные столбцы "Входные данные", выполнить поиск подходящих входных данных (например, "Удобрения" или "Пестициды") и передать результат в формате "Да / Нет" новым переменным для каждого из них. из 4 типов входных данных в наборе данных (удобрения, пестициды, гербициды и гибридные семена). Другими словами, результаты цикла x
выше будет генерировать следующие столбцы для вновь созданных переменных "Да / Нет":
Fertilisers <- c("Yes", "Yes", "Yes", "Yes", "No")
Herbicides <- c("No", "No", "No", "Yes", "No")
Pesticides <- c("No", "No", "Yes", "Yes", "No")
Hybrid_Seeds <- c("Yes", "Yes", "No", "Yes", "No")
x2 <- data.frame(Fertilisers, Herbicides, Pesticides, Hybrid_Seeds)
x2
Fertilisers Herbicides Pesticides Hybrid_Seeds
1 Yes No No Yes
2 Yes No No Yes
3 Yes No Yes No
4 Yes Yes Yes Yes
5 No No No No
Может быть проще визуализировать то, что я хотел бы, когда кадры данных x
а также x2
объединены в одну:
x3 <- data.frame(x, x2)
x3
Input_1 Input_2 Input_3 Input_4 Fertilisers Herbicides
1 Fertilisers Hybrid_Seeds <NA> <NA> Yes No
2 Fertilisers Hybrid_Seeds <NA> <NA> Yes No
3 Fertilisers Pesticides <NA> <NA> Yes No
4 Fertilisers Herbicides Pesticides Hybrid_Seeds Yes Yes
5 <NA> <NA> <NA> <NA> No No
Pesticides Hybrid_Seeds
1 No Yes
2 No Yes
3 Yes No
4 Yes Yes
5 No No
4 входа следуют определенному порядку, то есть удобрения всегда будут первыми (Input_1), если домохозяйство использует удобрения, гербициды будут Input_2, если они используют и удобрения, и гербициды (если они используют удобрения и пестициды, но НЕ гербициды, то пестициды будут Input_2 и т. Д. Если домохозяйство использует все 4 входа, они будут отображаться в следующем порядке (см. Строку 4 выше): удобрения, гербициды, пестициды, Hybrid_Seeds.
Я пытался создать for
циклы для циклического перебора всех 4 входных переменных, поиска совпадающих строк и ввода "Да" в связанной новой входной переменной (например, новой переменной "Удобрения", если в любом из 4 существующих совпадений найдено "Удобрения") Входные переменные), но я не имел большого успеха.
Кажется, что нет apply
Семейное решение этой проблемы, но я был бы рад исправить. Опять же, я новичок в R и программировании в целом, поэтому любая помощь будет принята с благодарностью. У меня есть (очень ограниченный) опыт работы с for
циклы, но эта проблема оказалась слишком сложной для меня, и очень важно, чтобы она была решена, так как это является серьезным препятствием для продвижения вперед в моих исследованиях.
Большое спасибо заранее.
1 ответ
Мы можем использовать table
tbl <- table(row(x), as.character(unlist(x)))
Лучше оставить его как двоичный вывод, а не менять на "Да / Нет", но если нам нужно преобразовать то
tbl[] <- c("No", "Yes")[tbl+1]
и это может быть преобразовано в data.frame
as.data.frame.matrix(tbl)
# Fertilisers Herbicides Hybrid_Seeds Pesticides
#1 Yes No Yes No
#2 Yes No Yes No
#3 Yes No No Yes
#4 Yes Yes Yes Yes
#5 No No No No