将一个R数据集中的列/行与另一个R数据集中的值相乘

时间:2018-04-30 20:47:58

标签: r dataframe

我有以下两个数据集:

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.                                 

我需要将dataset1的每一列乘以dataset2中的相应值。例如,dataset2中P1的值需要将dataset1中P1列的每一行乘以3。 我在这里展示的只是我的数据的摘录。数据集1有数千个输入。

如果这两个数据集相乘,输出将如下所示:

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 :(得分:6)

我们可以使用Dataset1乘以Dataset2Dataset2中的每一列。 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 是最终输出。

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)

数据

var = ['a','b','c']
rels = {}
for item in var:
    rel = {}
    for i in range(0,len(var)):
       if(item == var[i]): 
           rel[item] = 1
       else:
           rel[item] = item+"_"+var[i]
    rels[item] = rel

答案 1 :(得分:4)

您可以使用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

Dataset1Dataset2定义为@ www的答案。

答案 2 :(得分:3)

直接乘法。这可能是最快的解决方案:

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

答案 3 :(得分:1)

一个选项是使用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)

答案 4 :(得分:0)

你可以用for循环来做,如果data1是你的第一个数据集而data2是第二个数据集,那么:

for(i in 1:dim(data2)[2]){
      data1[,i] <- data1[,i]*data2
}

答案 5 :(得分:0)

你可以使用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. 使用tidyr的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
     ...