r: использование `for` и` if` для запуска функции run только для числовых переменных - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть четыре столбца данных с date, var1_share, var2_share и total.Я хочу умножить каждую из share метрик на total только для создания новых переменных, содержащих необработанные значения для обоих var1 & var2.Ниже приведен код (немного подробный), чтобы создать фрейм данных, содержащий переменные общего доступа:

df<- data.frame(dt= seq.Date(from = as.Date('2019-01-01'), 
    to= as.Date('2019-01-10'), by= 'day'),
    var1= round(runif(10, 3, 12), digits = 1), 
    var2= round(runif(10, 3, 12), digits = 1))
df$total<- apply(df[2:3], 1, sum)
ratio<- lapply(df[-1], function(x) x/df$total)
ratio<- data.frame(ratio)
df<- cbind.data.frame(df[1],ratio)
colnames(df)<- c('date', 'var1_share', 'var2_share', 'total')
df

Конечный фрейм данных должен выглядеть следующим образом:

> df
date var1_share var2_share total
1  2019-01-01  0.5862069  0.4137931     1
2  2019-01-02  0.6461538  0.3538462     1
3  2019-01-03  0.3591549  0.6408451     1
4  2019-01-04  0.7581699  0.2418301     1
5  2019-01-05  0.3989071  0.6010929     1
6  2019-01-06  0.5132743  0.4867257     1
7  2019-01-07  0.5230769  0.4769231     1
8  2019-01-08  0.4969325  0.5030675     1
9  2019-01-09  0.5034965  0.4965035     1
10 2019-01-10  0.3254438  0.6745562     1

Я вложил if оператор внутри цикла for, в надежде вернуть новый фрейм данных с именем share.Я хочу, чтобы он пропускал date при использовании переменных общего доступа, для которых я включил is.numeric, чтобы он игнорировал date, однако, когда я запускаю его, он возвращает только дату, а не желаемый результат даты,доля каждой переменной (в виде отдельных столбцов) и общий столбец.См. Код ниже:

for (i in df){
  share<- if(is.numeric(i)){
     i * df$total
    } else i
  share<- data.frame(share)
  return(share)
}
share

> share
share
1  2019-01-01
2  2019-01-02
3  2019-01-03
...

Как настроить эту функцию таким образом, чтобы share возвращал фрейм данных, содержащий дату, переменные 1 и 2 необработанных переменных и итог?

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

Можно заметить, что умножение вектора (*) на data.frame приведет к умножению по столбцу на кадр данных (умножьте вектор на столбцы 1, 2, 3 и т. Д.).).Таким образом, вы можете сделать это без какого-либо «применения», просто используя * от общего столбца и столбцов, которые вы хотите умножить.

Или вы можете сделать простую функцию для достижения результата.Ниже приведен такой пример.

Multi_share <- function(x, total_col = "total"){
  if(is.character(total_col))
    return(x[,sapply(x, is.numeric)[names(x) != total_col]] * x[, total_col])
  if(is.numeric(total_col) && NROW(total_col) == NROW(x))
    return(x[,sapply(x, is.numeric)] * total_col)
  stop("Total unrecognized. Must either be a 1 dimensional vector, a column matrix or a character specifying the total column in R.")
}
cbind(df, Multi_share(df))

Можно также изменить имена столбцов.

0 голосов
/ 27 февраля 2019

Может быть, вы хотите что-то подобное?

share <-df[, sapply(df,is.numeric)]
share <-mapply(function(x) x*share$total, share[,names(share)!="total"])

Первая строка вернет вам только числовые столбцы (таким образом, дата фильтруется).Второй умножит каждый столбец (кроме итого) и итого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...