2014-10-10 2 views
1

У меня есть кадр данных с четырьмя столбцами, назовем их V1-V4 и десятью наблюдениями. Точно один из V1-V4 равен 1 для каждой строки, а остальные из V1-V4 равны 0. Я хочу создать новый столбец с именем NEWCOL, который принимает значение 3, если V3 равно 1, 4, если V4 равно 1, и равно нулю.Создание фактора/категориальной переменной из 4 манекенов

Я должен сделать это для МНОГИХ наборов переменных V1-V4, поэтому я хотел бы, чтобы решение было как можно короче, чтобы было легко реплицироваться.

+1

Добро пожаловать в SO. Для получения наилучших ответов вам необходимо предоставить [воспроизводимый пример] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example). –

ответ

1

Это делает для 4 колонки, чтобы добавить пятую с помощью матричного умножения:

> cbind(mydf, newcol=data.matrix(mydf) %*% c(0,0,3,4)) 
    V1 V2 V3 V4 newcol 
1 1 0 0 0  0 
2 1 0 0 0  0 
3 0 1 0 0  0 
4 0 1 0 0  0 
5 0 0 1 0  3 
6 0 0 1 0  3 
7 0 0 0 1  4 
8 0 0 0 1  4 
9 0 0 0 1  4 
10 0 0 0 1  4 

Это обобщение для получения нескольких столбцов .... нам просто нужны правила. Вам нужно создать матрицу с тем же количеством строк, что и в исходных данных, и иметь один столбец для каждого из новых факторов, необходимых для создания каждой новой переменной. Это показывает, как построить один новый столбец из суммы 3-х кратного третьего столбца плюс 4-кратный четвертый, а другой новый столбец - от первого раза и второго раза.

> cbind(mydf, newcol=data.matrix(mydf) %*% matrix(c(0,0,3,4, # first set of factors 
                1,2,0,0), # second set 
                ncol=2)) 
    V1 V2 V3 V4 newcol.1 newcol.2 
1 1 0 0 0  0  1 
2 1 0 0 0  0  1 
3 0 1 0 0  0  2 
4 0 1 0 0  0  2 
5 0 0 1 0  3  0 
6 0 0 1 0  3  0 
7 0 0 0 1  4  0 
8 0 0 0 1  4  0 
9 0 0 0 1  4  0 
10 0 0 0 1  4  0 
+0

Большое спасибо! – garson

0

Заданная пример данных:

mydf <- data.frame(V1 = c(1, 1, rep(0, 8)), 
        V2 = c(0, 0, 1, 1, rep(0, 6)), 
        V3 = c(rep(0, 4), 1, 1, rep(0, 4)), 
        V4 = c(rep(0, 6), rep(1, 4))) 
# V1 V2 V3 V4 
# 1 1 0 0 0 
# 2 1 0 0 0 
# 3 0 1 0 0 
# 4 0 1 0 0 
# 5 0 0 1 0 
# 6 0 0 1 0 
# 7 0 0 0 1 
# 8 0 0 0 1 
# 9 0 0 0 1 
# 10 0 0 0 1 

Вот простой подход, чтобы создать новый столбец:

mydf <- transform(mydf, NEWCOL = V3 * 3 + V4 * 4) 
# V1 V2 V3 V4 NEWCOL 
# 1 1 0 0 0  0 
# 2 1 0 0 0  0 
# 3 0 1 0 0  0 
# 4 0 1 0 0  0 
# 5 0 0 1 0  3 
# 6 0 0 1 0  3 
# 7 0 0 0 1  4 
# 8 0 0 0 1  4 
# 9 0 0 0 1  4 
# 10 0 0 0 1  4 
+0

Да, спасибо! Я уже думал об этом, но мне нужно сделать это для множества групп столбцов (скажем, 1-4, 5-8, 9-12, 13-16, вплоть до 97-100) и есть ли более автоматизированный способ сделать это, поэтому мне не нужно каждый раз перепечатывать? – garson

+2

@garson Определите правила, и мы увидим, что мы можем сделать. –

Смежные вопросы