Преобразование набора данных только с 0 и 1 значениями

Я не уверен, как это назвать, поэтому я постараюсь описать в терминах мирян, в чем проблема. У меня есть датафрейм, который состоит только из 0 и 1. Поэтому для каждого человека вместо одного столбца с факториальной стоимостью (например, низкая цена, 4 номера) у меня есть

      V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16 V17 V18 V19 V20 V21
1     0  0  0  1  0  0  0  1  0   1   0   0   0   0   1   1   0   0   0   1   0
2     1  0  0  0  0  0  0  1  1   0   0   0   0   0   1   0   0   1   0   0   1
3     0  0  0  1  1  0  0  0  0   0   1   0   0   0   1   1   0   0   1   0   0
4     0  0  0  1  0  1  0  0  0   0   1   0   1   0   0   0   1   0   1   0   0

Как я могу преобразовать набор данных в R, чтобы я мог создать новые столбцы (#number of rooms) и присвоить положению 1 (в 4-м столбце) vhigh значение? У меня есть несколько дорогих вариабалов, для которых мне нужно это сделать. 21 столбец представляет 6 переменных для 1000+ наблюдений. должно быть что-то вроде этого

     PurchaseP.   NumberofRooms ...
1.      vhigh.         4
2.      low.           4
3.      vhigh.         1
4.      vhigh.         2

Только что сделал это для первых двух эпсиленаторных вариабелей, но, по сути, он повторяется так, что каждая объяснительная переменная имеет 3-4 возможных факторных значения.

V1: V4 = цена покупки, V5:V8 = количество комнат,V9:V11 = этажи и т. Д.

В моей голове что-то подобное может сработать

  1. создайте if statemt, чтобы дать каждому 1 значение в зависимости от положения столбца, напр. если значение в V4=1, тогда назовите "vhigh". и сделать это для каждого Vx
  2. Затем объедините каждый столбец V1:V4, V5:V8, V9:V11 (в зависимости от того, имеет ли он 3-4 возможных факторных / целочисленных значения), игнорируя при этом 0 значений.

Будет ли это работать, или есть более простой подход? Как бы один код это в R?

2 ответа

Если набор данных содержит одну единицу в строке, это довольно простая проблема

Здесь ваши данные в соответствии с вашей картинкой (пожалуйста, отредактируйте ваш вопрос, чтобы поставить код вместо картинки)

df = data.frame(r1 = 0, r2 = 1, r3 = 0)
rownames(df)<- 1

Затем вы просто должны сложить свой столбец с номером комнаты в качестве веса

df$room = df$r1*1 + df$r2 * 2 + df$r3 *3

Вы можете использовать функцию, которая () похожа на

lapply(df, function(x) { %now x is a row
    idx = which(x == 1)[1] 
    return(idx)
    })

Интересная часть заключается в использовании which(x ==1) на каждом ряду. Это дает вам массив всех индексов, которые содержат единицу. Первый из них может использоваться в вашем случае (при условии, что у вас есть только один 1 на строку). В противном случае необходимо обсудить агрегирование. Полученный столбец можно затем преобразовать в фактор, дав разумные имена различным индексам.

Другие вопросы по тегам