我有两个数据框。第一个包含不同样本(列)中特定序列(行)的出现次数,如下所示:
df1<- as.data.frame(matrix(c(9, 0, 0, 9, 0, 0, 9, 0, 0, 2472, 0, 0, 0, 0, 0, 0, 0, 310, 0, 2460, 0, 0, 0, 10), nrow=8, ncol=3, byrow=TRUE))
names(df1)<-c("A","B","C")
rownames(df1)<-paste("seq00",seq(1:8),sep="")
第二个包含需要在第一个表中更新的行和列的ID,以及值更改。它看起来像这样:
df2<-as.data.frame(matrix(cbind(c("A","A","A","B","C","A","B","C"),c("seq001","seq002", "seq003" ,"seq007" ,"seq008" ,"seq004" ,"seq005", "seq006"),list( -9 ,-9 ,-9 , 11, -10, 27, -11, 10)),nrow=8, ncol=3, byrow=F))
names(df2)<-c("colIDs","rowIDs","change.value.by")
是否有一种简单的方法可以使用第二个表中的行ID和列ID来更新第一个数据框中的值?我的实际数据帧非常大,并且不需要更新df1中的所有值。提前谢谢!
答案 0 :(得分:0)
我们可以使用dplyr
和tidyr
。这可以通过gather
将数据转换为长格式,使用left_join
合并所需的更改,mutate
更改,然后spread
返回宽格式:
library(dplyr)
library(tidyr)
df1 %>% add_rownames("row") %>%
gather(var, val, -row) %>%
left_join(df2, by = c(row = "rowIDs", var = "colIDs")) %>%
mutate(val = ifelse(is.na(change.value.by), val, val + change.value.by)) %>%
select(-change.value.by) %>%
spread(var, val)
Source: local data frame [8 x 4]
row A B C
(chr) (dbl) (dbl) (dbl)
1 seq001 0 0 0
2 seq002 0 0 0
3 seq003 0 0 0
4 seq004 2499 0 0
5 seq005 0 -11 0
6 seq006 0 0 320
7 seq007 0 2471 0
8 seq008 0 0 0