如果列包含特定值,则将列名称指定为单元格值

Assigning column name as cell value if column contains specific value

提问人:Sam 提问时间:2/17/2020 更新时间:2/17/2020 访问量:241

问:

我对 R 很陌生。我有一个数据框,其中包含成对的入院和出院变量,这些变量应该匹配,例如:

  V1adm V1dis V2adm V2dis V3adm V3dis
1   120   120   yes   yes    60    60
2   110   110   yes  <NA>    40    40
3    60    NA    no  <NA>    NA    NA
4    90    NA  <NA>    no    20    NA

如果缺少任何一个变量对,我创建了一个具有 TRUE 的数据帧:

# Variable names
adm_vars<- c("V1adm", "V2adm", "V3adm")
dis_vars<- c("V1dis", "V2dis", "V3dis")

# Create empty dataframe
pairs_NA<- matrix(NA, ncol=3, nrow=nrow(data))
pairs_NA<- as.data.frame(pairs_NA)
names(pairs_NA)<- paste(adm_vars, dis_vars, sep = '_')

# Add TRUE if adm OR dis variable NA
for(i in 1:3){
  x<- data[, adm_vars[i]]
  y<- data[, dis_vars[i]]
  pairs_NA[,i]<- is.na(x) | is.na(y)
}

  V1adm_V1dis V2adm_V2dis V3adm_V3dis
1       FALSE       FALSE       FALSE
2       FALSE        TRUE       FALSE
3        TRUE        TRUE        TRUE
4        TRUE        TRUE        TRUE

对于所有 3 个都缺失的行,我想创建一个数据框,如果缺少该对(即列在pairs_NA中为 TRUE),则将“pairs_NA”中的列名作为单元格值。它应该看起来像这样:

              1             2             3
3   V1adm_V1dis   V2adm_V2dis   V3adm_V3dis
4   V1adm_V1dis   V2adm_V2dis   V3adm_V3dis

如果每行的列中都有“TRUE”,我有没有办法将“pairs_NA”的列名指定为单元格值?

r

评论


答:

2赞 akrun 2/17/2020 #1

我们可以基于“pairs_NA”的列名创建一个逻辑索引,并在子集所有值为 TRUE 的行后复制列名rowSums

i1 <- rowSums(pairs_NA) == ncol(pairs_NA)
matrix(names(pairs_NA)[col(pairs_NA[i1,])], ncol = ncol(pairs_NA))
#    [,1]          [,2]          [,3]         
#[1,] "V1adm_V1dis" "V2adm_V2dis" "V3adm_V3dis"
#[2,] "V1adm_V1dis" "V2adm_V2dis" "V3adm_V3dis"