从列到行循环遍历两个数据表?

时间:2014-01-31 23:42:44

标签: r dataframe

我有两个数据框:

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$BC C中的第一列值查找DT1中的列名,根据层次结构逻辑,如下:

我想循环遍历除第一列之外的DT1列名称并嵌套循环通过DT2第一列值以检查它们是否相等。如果它们相等,则获取DT2$BC C值并检查是否DT1$(DT2$BCC) = 1,如果是,则在DT1

中的(HIER1, HIER2, HIER3,.......)列中设置值0
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匹配。 我无法得到正确的方法。对不起,我很抱歉。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

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自动重新排序行。

相关问题