【问题标题】:Loop through two data tables from column to row wise?从列到行循环遍历两个数据表?
【发布时间】:2014-01-31 23:42:43
【问题描述】:

我有两个数据框:

DT1:(我需要根据另一个数据表DT2编辑这个数据框的列值)

BIC         BCC1    BCC2    BCC6    BCC8    BCC9    BCC10   BCC11
990081899A  0   1   0   0   0   0   0
9900023620  0   1   1   0   0   0   0
9900427160  0   1   0   1   0   0   0
990064457TA 1   1   0   1   0   0   0
990066595A  0   0   0   0   0   0   1
990088248A  0   0   0   0   0   0   1
990088882C1 0   0   0   0   0   0   1
990088882C2 0   0   0   1   1   0   0
990088882C3 0   0   0   1   1   0   0
990088882C4 0   0   0   1   1   0   0
990088882C5 0   0   0   1   1   0   0

DT2:

BCC HIER1   HIER2   HIER3   HIER4   HIER5
BCC8    BCC9    BCC10   BCC11   BCC12   0
BCC9    BCC10   BCC11   BCC12   0   0
BCC10   BCC11   BCC12   0   0   0
BCC11   BCC12   0   0   0   0
BCC17   BCC18   BCC19   0   0   0
BCC18   BCC19   0   0   0   0
BCC27   BCC28   BCC29   BCC80   0   0
BCC28   BCC29   0   0   0   0
BCC46   BCC48   0   0   0   0
BCC54   BCC55   0   0   0   0
BCC57   BCC58   0   0   0   0
BCC70   BCC71   BCC72   BCC103  BCC104  BCC169

我想根据层次逻辑通过DT2$BCC中的第一列值查找DT1中的列名,如:

我想遍历除第一列之外的 DT1 列名,并将该循环嵌套在 DT2 第一列值中以检查它们是否相等。如果它们相等,则获取 DT2$BCC 值并检查 DT1$(DT2$BCC) = 1,如果是,则将 DT1 列中的值 0 设置为 (HIER1, HIER2, HIER3,.......)

Result should be:

BIC         BCC1    BCC2    BCC6    BCC8    BCC9    BCC10   BCC11
990081899A  0   1   0   0   0   0   0
9900023620  0   1   1   0   0   0   0
9900427160  0   1   0   1   0   0   0
990064457TA 1   1   0   1   0   0   0
990066595A  0   0   0   0   0   0   0
990088248A  0   0   0   0   0   0   0
990088882C1 0   0   0   0   0   0   0
990088882C2 0   0   0   1   0   0   0
990088882C3 0   0   0   1   0   0   0
990088882C4 0   0   0   1   0   0   0
990088882C5 0   0   0   1   0   0   0

我现在正在这样做:

cols<-setdiff(names(DT1), "HIC")
subs<-as.character(DT2$BCC)
colsHier<-setdiff(names(DT2), "BCC")
paste0("DT1$", eval(cols[i]))<-
         for( i in 1:length(cols)){
         for (k in 1:length(subs)){
         ifelse(cols[i] == subs[k], 
         ifelse(do.call(paste0, list('DT1$', eval(cols[1]),'[]')) == 1,
         for (j in 1:length(colsHeir)){
         if(colsHeir[j]!= 0)
         x<-paste0('DT2$',eval(colsHier[j]))
         paste0('DT1$',eval(x[k])):= 0}
         ,DT1$cols[i]), DT1$cols[i])}}

我正在尝试匹配 do.call(paste0, list('DT1$', eval(cols[1]),'[]')) == 1 的值,但是当我在 R 中运行此表达式时,我得到以下结果:

> do.call(paste0, list('DT1$', eval(cols[2]),'[1]'))
[1] "DT1$BCC2[1]"

而不是单元格的值。如何访问该单元格的值以匹配 1。 我无法获得正确的方法。我很抱歉问了很长的问题。任何帮助表示赞赏。

【问题讨论】:

    标签: r dataframe


    【解决方案1】:
    library(reshape2)
    

    融化数据

    dt1.m <- melt(dt1, id = "BIC")
    dt2.m <- melt(dt2, id = "BCC")
    

    如果 dt1.m$ 变量等于 dt2.m 中的值之一,则将其设置为 0

    dt1.m$value <- ifelse(dt1.m$variable %in% dt2.m$value, 0, dt1.m$value)
    

    将数据转换成适当的形式

    dt1.c <- dcast(dt1.m, ...~variable)
    

    Dcast 自动重新排序行。

    【讨论】:

    • 非常感谢,但这并没有提供所需的输出。可能是我没有正确解释我的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-25
    • 2018-03-16
    • 1970-01-01
    • 2012-08-25
    相关资源
    最近更新 更多