Объединить столбцы, которые могут иметь или не иметь перекрывающиеся данные, используя R
Допустим, у вас есть набор данных, который выглядит следующим образом:
Vietnam Gulf War Iraq War
veteran1 1 0 0
veteran2 0 1 0
veteran3 0 0 1
veteran4 0 1 1 # <---- Note this row
Вы хотите объединить эти столбцы, не затрагивая другие столбцы в кадре данных, например:
Service
veteran1 1
veteran2 2
veteran3 3
veteran4 2 # <---- Note this row
куда
1 = Vietnam
,2 = Gulf War
,3 = Iraq War
- Если ветеран подал 2 или более, он должен выбрать только один (как в случае с
veteran4
где он выбрал свою левую колонку) - Есть много других столбцов в кадре данных, и они не должны быть затронуты этим
Вопросы:
Как бы вы сделали это в R
?
(Примечание: если это проще сделать в какой-либо другой бесплатной программе с открытым исходным кодом, пожалуйста, не стесняйтесь поделиться, какая программа и как вы это сделаете. Это огромный набор данных: 3 миллиона строк, опрос Американского сообщества.)
2 ответа
Глядя на ваши данные, кажется, простой вопрос:
если Вьетнам> 0, тогда используйте 1, в противном случае, если война в Персидском заливе> 0, затем 2, в противном случае, если Ирак> 0, то 3, иначе 0
vietnam = c(1, 0, 0,0)
gulfwar = c(0,1,0,1)
iraq = c(0,0,1,1)
df = data.frame(vietnam, gulfwar, iraq)
df$service <- ifelse(df$vietnam > 0,1,ifelse(df$gulfwar>0,2,ifelse(df$iraq>0,3,0)))
df
Результат:
vietnam gulfwar iraq service
1 1 0 0 1
2 0 1 0 2
3 0 0 1 3
4 0 1 1 2
Может быть, немного сложнее (по отношению к другим решениям), но вот один подход, использующий apply
:
df$service <- apply(df, 1, function(x) which(x == 1)[1] )
df
vietnam gulfwar iraq service
1 1 0 0 1
2 0 1 0 2
3 0 0 1 3
4 0 1 1 2