умножить столбцы / строки в одном наборе данных R на значения из другого - PullRequest
0 голосов
/ 30 апреля 2018

У меня есть два следующих набора данных:

Dataset1                                 Dataset2

Kingdom  P1  P2  P5  P6  P7  T4  T6      P1  P2  P5  P6  P7  T4  T6
Virus    5   4   4   5   5   3   3       3   4   4   2   1   1   6
Bacteria 3   3   4   6   1   2   1       
Animal   1   2   3   4   4   1   5     
etc.                                 

Мне нужно умножить каждый столбец набора данных1 на соответствующие значения в наборе данных2. Например, значение P1 в наборе данных2 должно умножаться на каждую строку столбца P1 в наборе данных1 на 3. То, что я показываю здесь, это просто отрывок из моих данных. Dataset1 имеет тысячи входов.

Если умножить эти два набора данных, результат будет выглядеть примерно так:

Kingdom  P1  P2  P5  P6  P7  T4  T6                    
Virus    15  16  16  10   5   3  18                      
Bacteria 9   12  16  12   1   2   6       
Animal   3   8   12   8   4   1  30     
etc. 

Буду очень признателен за любые идеи о том, как решить эту проблему! Спасибо.

Ответы [ 6 ]

0 голосов
/ 01 мая 2018

Просто сделайте прямое умножение. Вероятно, это будет самое быстрое решение:

cbind(Dataset1[1],t(t(Dataset1[-1])*unlist(Dataset2)))
   Kingdom P1 P2 P5 P6 P7 T4 T6
1    Virus 15 16 16 10  5  3 18
2 Bacteria  9 12 16 12  1  2  6
3   Animal  3  8 12  8  4  1 30

Вы также можете сделать cbind(Dataset1[1],t(t(Dataset1[-1])*c(t(Dataset2))))

Вы также можете использовать sweep

cbind(Dataset1[1],sweep(Dataset1[-1],2,unlist(Dataset2),"*"))

   Kingdom P1 P2 P5 P6 P7 T4 T6
1    Virus 15 16 16 10  5  3 18
2 Bacteria  9 12 16 12  1  2  6
3   Animal  3  8 12  8  4  1 30
0 голосов
/ 01 мая 2018

Можно использовать apply и умножение массива.

cbind(Dataset1[1], do.call(rbind, apply(Dataset1[-1], 1, function(x)(x*Dataset2[1,]))))

#    Kingdom P1 P2 P5 P6 P7 T4 T6
# 1    Virus 15 16 16 10  5  3 18
# 2 Bacteria  9 12 16 12  1  2  6
# 3   Animal  3  8 12  8  4  1 30

Примечание: Приведенный выше ответ весьма похож на ответ @JilberUrbina.

Данные:

Dataset1 <- read.table(text =                                 
"Kingdom  P1  P2  P5  P6  P7  T4  T6      
Virus    5   4   4   5   5   3   3       
Bacteria 3   3   4   6   1   2   1       
Animal   1   2   3   4   4   1   5",
header = TRUE)


Dataset2 <- read.table(text =
"P1  P2  P5  P6  P7  T4  T6
3   4   4   2   1   1   6",
header = TRUE)
0 голосов
/ 01 мая 2018

Вы можете сделать это, используя пакеты dplyr и tidyr.

Давайте предположим, что это ваш набор данных:

ds_1 <- read.table(header = TRUE, text = "Kingdom  P1  P2  P5  P6  P7  T4  T6
Virus    5   4   4   5   5   3   3 
Bacteria 3   3   4   6   1   2   1       
Animal   1   2   3   4   4   1   5")

   Kingdom P1 P2 P5 P6 P7 T4 T6
1    Virus  5  4  4  5  5  3  3
2 Bacteria  3  3  4  6  1  2  1
3   Animal  1  2  3  4  4  1  5

ds_2 <- read.table(header = TRUE, text = "P1  P2  P5  P6  P7  T4  T6
3   4   4   2   1   1   6")

  P1 P2 P5 P6 P7 T4 T6
1  3  4  4  2  1  1  6
  1. Переключение с широкого на длинный с использованием тидира gather():

    ds_1 <- ds_1 %>% gather(Key, Value, -Kingdom)
    
        Kingdom Key Value
    1     Virus  P1     5
    2  Bacteria  P1     3
    3    Animal  P1     1
    4     Virus  P2     4
    5  Bacteria  P2     3
    6    Animal  P2     2
    ...
    
    ds_2 <- ds_2 %>% gather(Key, Multiplier)
    
        Key Multiplier
     1  P1          3
     2  P2          4
     3  P5          4
     4  P6          2
     ... 
    
  2. Теперь вы можете просто объединить два фрейма данных с помощью dplyr left_join() и умножить с помощью mutate():

    ds_1 %>% left_join(ds_2, by = "Key") %>%
        mutate(Value = Value * Multiplier) %>%
        select(-Multiplier)
    
         Kingdom Key Value
     1     Virus  P1    15
     2  Bacteria  P1     9
     3    Animal  P1     3
     4     Virus  P2    16
     5  Bacteria  P2    12
     6    Animal  P2     8
     7     Virus  P5    16
     8  Bacteria  P5    16
     ...
    
0 голосов
/ 01 мая 2018

Вы можете использовать apply

> do.call(rbind, apply(Dataset1[,-1], 1, "*", Dataset2))
  P1 P2 P5 P6 P7 T4 T6
1 15 16 16 10  5  3 18
2  9 12 16 12  1  2  6
3  3  8 12  8  4  1 30

Dataset1 и Dataset2 определены как в ответе @ www.

0 голосов
/ 01 мая 2018

Мы можем использовать mapply для умножения каждого столбца с Dataset1 и Dataset2. Dataset2 - конечный результат.

Dataset3 <- Dataset1
Dataset3[, -1]<- mapply(`*`, Dataset1[, -1], Dataset2)
Dataset3
#    Kingdom P1 P2 P5 P6 P7 T4 T6
# 1    Virus 15 16 16 10  5  3 18
# 2 Bacteria  9 12 16 12  1  2  6
# 3   Animal  3  8 12  8  4  1 30

DATA

Dataset1 <- read.table(text = "Kingdom  P1  P2  P5  P6  P7  T4  T6
Virus    5   4   4   5   5   3   3       
Bacteria 3   3   4   6   1   2   1       
Animal   1   2   3   4   4   1   5",
                       header = TRUE, stringsAsFactors = FALSE)

Dataset2 <- read.table(text = "P1  P2  P5  P6  P7  T4  T6
                       3   4   4   2   1   1   6",
                       header = TRUE)
0 голосов
/ 01 мая 2018

Вы можете сделать это с помощью цикла for, если data1 - ваш первый набор данных, а data2 - второй набор данных, тогда:

for(i in 1:dim(data2)[2]){
      data1[,i] <- data1[,i]*data2
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...