【问题标题】:R, conditional replacement using row and column names and values from another tableR,使用另一个表中的行和列名称和值进行条件替换
【发布时间】:2015-11-18 00:42:31
【问题描述】:

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

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 来更新第一个数据框中的值?我的实际数据框非常大,并非 df1 中的所有值都需要更新。提前致谢!

【问题讨论】:

    标签: r


    【解决方案1】:

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

    【讨论】:

    • 谢谢!一旦我修复了我的原始代码,这就完美地工作了,所以 df2 中的最后一列包含数字而不是列表!
    • 不错的一个 - 我忘了包括它:df2[] &lt;- lapply(df2, unlist)
    猜你喜欢
    • 1970-01-01
    • 2011-06-09
    • 1970-01-01
    • 2022-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-31
    相关资源
    最近更新 更多