У меня есть четыре столбца данных с 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 необработанных переменных и итог?