书名有点乱七八糟,但我不知道还能怎么形容.我来自斯塔塔,所以我仍然掌握了各种因素的诀窍.

基本上,我希望能够分配因子级别和标签,但我错过的任何级别/标签都被分配为默认级别/标签.

采取以下措施:

library(dplyr)
dt <- as.data.frame(mtcars)  # load demo data
dt$carb[4:6] <- NA           # set some rows to NA for example

dt <- dt%>%
  mutate(
    carb_f = factor(carb,
                    levels = c(1,2,3,4), 
                    labels = c("One","Two","Three","Four")
                    )
  )

table(dt$carb, dt$carb_f, exclude=NULL)

这将产生以下结果:

       One Two Three Four <NA>
  1      5   0     0    0    0
  2      0   9     0    0    0
  3      0   0     3    0    0
  4      0   0     0   10    0
  6      0   0     0    0    1
  8      0   0     0    0    1
  <NA>   0   0     0    0    3

未陈述的68在合成因数carb_f中被设置为NA.虽然这是意料之中的行为,但我希望能够请求如下内容:

dt <- dt%>%
  mutate(
    carb_f = factor(carb,
                    levels = c(1,2,3,4), 
                    labels = c("One","Two","Three","Four"),
                    non-na(10,"Unk")   # obvious pseudocode
                    )
  )

要实现此目标,请执行以下操作:

       One Two Three Four Unk <NA>
  1      5   0     0    0   0    0
  2      0   9     0    0   0    0
  3      0   0     3    0   0    0
  4      0   0     0   10   0    0
  6      0   0     0    0   1    0
  8      0   0     0    0   1    0
  <NA>   0   0     0    0   0    3

...其中未声明的68被分配到默认级别/标签10Unk,但真实的NA保持NA.

有没有一种方法可以在不明确引用68的情况下处理此问题?

推荐答案

只需多次使用同一标签即可.

dt <- transform(dt, carb_f=factor(carb, labels=c('one', 'two', 'three', 'four', 'unk', 'unk')))
table(dt$carb, dt$carb_f, useNA='ifany')
#      one two three four unk <NA>
# 1      5   0     0    0   0    0
# 2      0   9     0    0   0    0
# 3      0   0     3    0   0    0
# 4      0   0     0   10   0    0
# 6      0   0     0    0   1    0
# 8      0   0     0    0   1    0
# <NA>   0   0     0    0   0    3

注意:我省略了levels=属性,因为自动按字母顺序排序就足够了.但是,如果我们想要不同的顺序,例如levels=c(2, 1, 3, 4, 6, 8)使用2作为第一级(因此是参考级别),这可能非常有用;此外,请注意,levelslabels在它们的位置上相对应.

为避免多次键入标签,请将各个级别合并为一个新级别,该级别高于所有其他级别,例如Inf,并在第二步中使用factor.这可以使用within很容易地完成.

dt <- within(dt, {
  carb_f <- ifelse(carb %in% c(6, 8), Inf, carb)
  carb_f <- factor(carb_f, labels=c('one', 'two', 'three', 'four', 'unk'))
})

table(dt$carb, dt$carb_f, useNA='ifany')
#      one two three four unk <NA>
# 1      5   0     0    0   0    0
# 2      0   9     0    0   0    0
# 3      0   0     3    0   0    0
# 4      0   0     0   10   0    0
# 6      0   0     0    0   1    0
# 8      0   0     0    0   1    0
# <NA>   0   0     0    0   0    3

R相关问答推荐

这两种创建S4对象的方法有何不同?

用R从API中提取数据

在之前合并的数据.tables中分配新列后.internal.selfref无效

R kableExtra在插入水平线时添加额外的空白行

过滤Expand.Grid的结果

如何使用ggplot重新绘制LASO回归图?

从API中抓取R数据SON

如何在R中添加截止点到ROC曲线图?

为什么横向页面会导致officeverse中的页码/节头/页脚出现问题?

在for循环中转换rabrame

删除具有相同标题的tabPanel(shinly)

Ggplot2中的重复注记

非线性混合效应模型(NLME)预测变量的置信区间

为什么我的基准测试会随着样本量的增加而出现一些波动?

如何将网站图像添加到带有极坐标的面包裹条形图?

停止ggplot将多行减少到一行

在gggraph中显示来自不同数据帧的单个值

R中治疗序列的相对时间指数

如何为混合模型输出绘制不同的线型?

注释不会绘制在所有ggplot2面上