我有以下两个数据集:
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.
如何解决这个问题的任何想法将不胜感激!谢谢。
答案 0 :(得分:6)
我们可以使用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
是最终输出。
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
Dataset1
和Dataset2
定义为@ 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
使用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
...
现在,您只需使用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
...