Использовать результат массива в качестве множителя для исходного кадра данных - PullRequest
1 голос
/ 21 декабря 2011

для данного фрейма данных Я хотел бы умножить значения массива на столбец фрейма данных. Фрейм данных состоит из строк, содержащих имя, числовое значение и два факторных значения:

name credit gender group
n1 10 m A
n2 20 f B
n3 30 m A
n4 40 m B
n5 50 f C

Этот кадр данных может быть сгенерирован с помощью команд:

name    <- c('n1','n2','n3','n4','n5')
credit  <- c(10,20,30,40,50)
gender  <- c('m','f','m','m','f')
group   <- c('A','B','A','B','C')
DF      <-data.frame(cbind(name,credit,gender,group))
# binds columns together and uses it as a data frame

Кроме того, у нас есть матрица, полученная из фрейма данных (в более сложных случаях это будет массив). Эта матрица содержит сумму всех контрактов, относящихся к определенной категории (характеризуемых m / f и A / B / C):

   m f
A 40 NA
B 40 20
C NA 50

Цель состоит в том, чтобы умножить значения в кредите в DF $, используя соответствующее значение, назначенное каждой категории в матрице, например, значение 10 первой строки в DF будет умножено на 40 (категория определена m и A).

Результат будет выглядеть так:

name credit gender group result
n1 10 m A 400
n2 20 f B 400
n3 30 m A 1200
n4 40 m B 1600
n5 50 f C 2500

Если возможно, я бы хотел выполнить это с помощью базового пакета R. Но я открыт для любых полезных решений, которые хорошо работают.

Ответы [ 3 ]

3 голосов
/ 21 декабря 2011

Вы можете построить набор индексов в derived (являясь вашей производной матрицей), сделав индексную матрицу из DF$group и DF$gender.Причина as.character в том, что DF$group и DF$gender являются факторами, тогда как я просто хочу индексы символов.

>idx = matrix( c(as.character(DF$group),as.character(DF$gender)),ncol=2)
>idx
[,1] [,2]
[1,] "A"  "m" 
[2,] "B"  "f" 
[3,] "A"  "m" 
[4,] "B"  "m" 
[5,] "C"  "f" 
>DF$result = DF$credit * derived[idx]

Обратите внимание на последнюю строку, используя код, который вы использовали выше, для генерацииDF, ваши числовые столбцы становятся факторами (т.е. DF$credit является фактором).В этом случае вам нужно сделать as.numeric(DF$credit)*derived[idx].Тем не менее, я представляю, что в ваших реальных данных ваш фрейм данных не имеет DF$credit в качестве фактора, а вместо этого в виде числа.

2 голосов
/ 21 декабря 2011

Я рекомендую пакет plyr, но вы можете сделать это с помощью базовой функции by:

> by(DF, DF['name'], function (row) row$credit * m[as.character(row$group), as.character(row$gender)])
name: n1
[1] 400
--------------------------------------------------------------------- 
name: n2
[1] 400
--------------------------------------------------------------------- 
name: n3
[1] 1200
--------------------------------------------------------------------- 
name: n4
[1] 1600
--------------------------------------------------------------------- 
name: n5
[1] 2500

plyr может дать вам результат в виде данныхкадр, который приятно:

> ddply(DF, .(name), function (row) row$credit * m[as.character(row$group), as.character(row$gender)])
  name   V1
1   n1  400
2   n2  400
3   n3 1200
4   n4 1600
5   n5 2500
2 голосов
/ 21 декабря 2011

Когда вы создаете объект data.frame, не используйте cbind, в этом нет необходимости, и это заставляет кредитную переменную стать фактором.

Просто используйте DF <- data.frame(name, credit, gender, group)

Затем запустите цикл for, который проходит через каждую строку в вашем объекте data.frame.

n <- length(DF$credit)
result <- rep(0, n)
for(i in 1:n) {
  result[i] <- DF$credit[i] * sum(DF$credit[DF$gender==DF$gender[i] & DF$group==DF$group[i]])
}

Замените ваш объект data.frame на новый, включающий ваши результаты.

DF <- data.frame(name, credit, gender, group, result)
...