Сокращение векторов (в рамках data.frame) кода мультипликации в R - PullRequest
1 голос
/ 01 февраля 2012

У меня есть этот код, чтобы выполнить серию умножения и сложения в R. Может ли кто-нибудь дать мне предложение использовать * apply, чтобы сделать его аккуратнее и короче?

Я посмотрел вокруг с такими ключевыми словами, как "series"," умножение "но никуда не деться.Если этот вопрос был опубликован ранее, пожалуйста, дайте мне знать ссылку.Спасибо.

df1n - это data.frame с> 78 переменными и 215 наблюдениями.

dff[,3]<-(df1n[5]*((df1n[25]*df1n[26]*df1n[27]) + (df1n[28]*df1n[29]*df1n[30]) +
         (df1n[31]*df1n[32]*df1n[33]) + (df1n[34]*df1n[35]*df1n[36]) + 
         (df1n[37]*df1n[38]*df1n[39]) + (df1n[40]*df1n[41]*df1n[42]) +
         (df1n[61]*df1n[62]*df1n[63]) + (df1n[64]*df1n[65]*df1n[66]) + 
         (df1n[67]*df1n[68]*df1n[69]) + (df1n[70]*df1n[71]*df1n[72]) + 
         (df1n[73]*df1n[74]*df1n[75]) + (df1n[76]*df1n[77]*df1n[78]))
         )

С уважением, ikel

Ответы [ 2 ]

3 голосов
/ 01 февраля 2012

Я бы использовал lapply() для построения списка индексов для каждой из (A*B*C) частей. Затем передайте эти индексы в sapply, извлекая каждый набор элементов из df1n и умножая их на prod(). Остальное говорит само за себя:

df1n <- 1:100
ll <- lapply(c(seq(25, 40, by=3), seq(61, 76, by=3)), 
             function(X) seq(X, by=1, length.out=3))
df1n[5] * sum(sapply(ll, function(i) prod(df1n[i])))
# [1] 11439180

EDIT : Теперь, когда я знаю, что каждый элемент df1n представляет собой вектор длиной 215, вот код, который я бы предложил вместо:

# Example data (a list in which each element is a vector of length 215).
x <- replicate(100, 1:215, simplify=FALSE) 
ll <- lapply(seq(25, 76, by=3), function(X) seq(X, by=1, length.out=3))
res <- x[[5]] * rowSums(sapply(ll, function(i) Reduce("*", x[i])))

str(res)
# num [1:215] 18 288 1458 4608 11250 ...
2 голосов
/ 01 февраля 2012

Вот модификация решения Джоша, которая выдает тот же результат, что и ваш исходный код, на примере данных ниже.

# Some sample data
df1n <- as.data.frame( lapply(1:80, function(i) seq(i, len=5)) )

df1n[5] * rowSums(sapply(c(seq(25,40,3), seq(61,76,3)), 
    function(i) df1n[[i]]*df1n[[i+1]]*df1n[[i+2]]))
#  c.5..6..7..8..9.
#1         11439180
#2         14386680
#3         17580528
#4         21032640
#5         24755220
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...