Как перебрать подмножество столбцов во фрейме данных для создания новых переменных

У меня есть несколько наборов данных, состоящих из ~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
Другие вопросы по тегам