R,使用行和列名称以及来自另一个表的值的条件替换

时间:2015-11-18 00:42:31

标签: r

我有两个数据框。第一个包含不同样本(列)中特定序列(行)的出现次数,如下所示:

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中的所有值。提前谢谢!

1 个答案:

答案 0 :(得分:0)

我们可以使用dplyrtidyr。这可以通过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