Умножение всех столбцов в кадре данных на один столбец - PullRequest
0 голосов
/ 10 декабря 2018

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

df1<-data.frame(F1=c(1,5,8,9),F2=c(1,5,8,9),F3=c(1,5,8,9))
> df1
  F1 F2 F3
1  1  1  1
2  5  5  5
3  8  8  8
4  9  9  9

C<-data.frame(C=c(2,1,2,0.5))
> C
    C
1 2.0
2 1.0
3 2.0
4 0.5

Я хочу умножить каждый столбец df1 на C. Я попытался:

df2<-df1[,c(1:3)]*C[,1]
df2<-df1*C
df2< df1%*%C
and
for(i in 2:length(names(b))) {
+     df2 <- C[, 1] * b[, i]
+ }

Спасибо!

Ответы [ 5 ]

0 голосов
/ 10 декабря 2018

Другое решение - sweep(df1, 1, C$C, `*`), что означает «вычистить» статистику, представленную C$C из каждого столбца df1 умножением.

0 голосов
/ 10 декабря 2018

Здесь много хороших ответов только для кода, поэтому я решил объяснить, что происходит не так.

Проблема в том, что вы пытаетесь выполнить функцию умножения (*) насписок столбцов, который является фреймом данных.Для умножения на один столбец (C) из второго фрейма данных (C) вы должны ссылаться на этот единственный столбец как C$C C["C"], C[,1] или C[1].Если бы вы сделали df1[,1]*C[,1] или один из других способов ссылки на первый столбец df1, он бы работал нормально.Но проблема в том, что вы хотите сделать все столбцы.

Поэтому вам нужно использовать стратегию для применения функции умножения к списку столбцов.Есть даже больше способов сделать это, чем уже было дано.Например:

 as.data.frame(lapply(df1, `*`, C$C))
0 голосов
/ 10 декабря 2018

Также попробуйте

df1 * t(C)
#    F1   F2   F3
#1  2.0  2.0  2.0
#2  5.0  5.0  5.0
#3 16.0 16.0 16.0
#4  4.5  4.5  4.5

Когда мы пытаемся умножить кадры данных, они должны иметь одинаковый размер.

df1 * C

Ошибка в Ops.data.frame (df1, C): '*' определено только для фреймов данных одинакового размера

t() превращает C в матрицу, то есть вектор с атрибутом измерения длины 4. Этот векторперерабатывается, когда мы умножаем его на df1.

Что также будет работать таким же образом (и может быть быстрее, чем транспонирование C):

df1 * C$C

или

df1 * unlist(C)
0 голосов
/ 10 декабря 2018

раствор dplyr с избыточным количеством

library(dplyr)

df1 %>%
  mutate_all(.,function(col){C$C*col})
0 голосов
/ 10 декабря 2018

Мы можем векторизовать умножение путем rep лицензирования столбца 'C'

df1 * C[row(df1)]
#     F1   F2   F3
#1  2.0  2.0  2.0
#2  5.0  5.0  5.0
#3 16.0 16.0 16.0
#4  4.5  4.5  4.5

или использовать rep явно

df1 * rep(C$C, ncol(df1))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...