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