【问题标题】:Assign NA to the name of table将 NA 分配给表的名称
【发布时间】:2017-07-28 22:04:45
【问题描述】:

在下面的示例中,我想将 NA 提取为一个级别并将其显示在表格中,就像其他级别一样。 levels() 函数不适用于 NA 值。有没有其他方法可以解决这个问题?

n=1000
comorbid<-sample(c(rep("diabetes",2),
  rep("hypertension",5),
  "cirrhosis","stroke","heartfailure",
  "renalfailure",rep("COPD",3)),
  n,
  replace=T)
comorbid[sample(1:n,50)]<-NA
mort<-sample(c(rep("alive",4),
"dead"),n,replace=T)
table.cat<-data.frame(matrix(rep(999,7),nrow=1))
table<-table(comorbid,useNA="always")
per<-prop.table(table)
table.sub<-table(comorbid,mort,useNA="always")
per.sub<-prop.table(table.sub,2)
p<-tryCatch({#using fisher's test when scarce data
      chisq.test(table.sub)$p.value
   }, warning = function(w) {
      fisher.test(table.sub,
      workspace = 10e7)$p.value
   })
frame<-data.frame(No.tot=as.data.frame(table)[,"Freq"],
     per.tot=as.data.frame(per)[,"Freq"],
     No.1=as.data.frame.matrix(table.sub)[,"alive"],
     per.1=as.data.frame.matrix(per.sub)[,"alive"],
     No.2=as.data.frame.matrix(table.sub)[,"dead"],
     per.2=as.data.frame.matrix(per.sub)[,"dead"],
     p=p)
rownames(frame)<-paste("comorbid",levels(comorbid),sep="_")

【问题讨论】:

    标签: r levels


    【解决方案1】:

    levels()NA 值一起工作得很好。然而levels() 需要的是一个因素(或任何具有levels 属性的东西)。根据您的代码,comorbid 是一个字符向量:

    > class(comorbid)
    [1] "character"
    

    如果您将comorbid 强制为一个因子更改默认值以便NAs 从因子级别中排除,您将获得所需的行为:

    fcomorbid <- factor(comorbid, exclude = NULL)
    
    levels(fcomorbid)
    paste("comorbid", levels(fcomorbid), sep = "_")
    
    > levels(fcomorbid)
    [1] "cirrhosis"    "COPD"         "diabetes"     "heartfailure" "hypertension"
    [6] "renalfailure" "stroke"       NA            
    > paste("comorbid", levels(fcomorbid), sep = "_")
    [1] "comorbid_cirrhosis"    "comorbid_COPD"         "comorbid_diabetes"    
    [4] "comorbid_heartfailure" "comorbid_hypertension" "comorbid_renalfailure"
    [7] "comorbid_stroke"       "comorbid_NA"
    

    然后完成您的示例

    rownames(frame) <- paste("comorbid", levels(fcomorbid), sep = "_")
    

    我们有

    > frame
                          No.tot per.tot No.1      per.1 No.2      per.2         p
    comorbid_cirrhosis        69   0.069   57 0.07011070   12 0.06417112 0.3108409
    comorbid_COPD            209   0.209  172 0.21156212   37 0.19786096 0.3108409
    comorbid_diabetes        128   0.128  101 0.12423124   27 0.14438503 0.3108409
    comorbid_heartfailure     57   0.057   45 0.05535055   12 0.06417112 0.3108409
    comorbid_hypertension    334   0.334  267 0.32841328   67 0.35828877 0.3108409
    comorbid_renalfailure     78   0.078   61 0.07503075   17 0.09090909 0.3108409
    comorbid_stroke           75   0.075   63 0.07749077   12 0.06417112 0.3108409
    comorbid_NA               50   0.050   47 0.05781058    3 0.01604278 0.3108409
    

    【讨论】:

    • 我不会说它“很好”:)。 levels(my_vec) &lt;- c(NA,"a") 有一个奇怪的行为,NA 级别将被 rbind 等函数删除。看到这个问题:stackoverflow.com/questions/45216532/…
    • 到目前为止,我的结论是,当您真正知道自己在做什么时,应该在本地使用 NA 级别,否则考虑用常规级别替换它们,例如“NA”或“unknown”
    • @Moody_Mudskipper 鉴于levels() 声明的目的是“提供[s] 对变量的级别属性的访问”。我会说这很好。您正在谈论替换函数变体levels&lt;-() 以及?levels 中记录的行为。
    • 您完全正确,Gavin,您的解决方案运行良好。但我认为值得一提的是,在使用 NA 级别时可能会出现许多问题。
    • @Moody_Mudskipper 我并不关心这如何应用于我的解决方案,更多的是建议 levels() 不适用于 NAs(根据 OP 的问题)或不t“工作正常”NAs。 levels() 甚至 levels&lt;- 都可以正常工作,这是在其他函数中对 NA 的因素以及作为规定水平所发生的情况。出于同样的原因,你想提供一个相关的警告,我的回复只是一个它可以正常工作的回应。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-27
    • 2021-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多