从R中的因子创建语法上有效的名称,同时保留级别

时间:2016-09-29 10:26:24

标签: r

我正在制作一个生物信息学闪亮的应用程序,它从excel文件中读取用户提供的组名。由于这些名称可以是非sytactically有效名称,我想在内部将它们表示为有效名称。

作为一个例子,我可以得到这个输入:

(grps <- as.factor(c("T=0","T=0","T=4-","T=4+","T=4+")))
[1] T=0  T=0  T=4- T=4+ T=4+
Levels: T=0 T=4- T=4+

理想情况下,我希望R生成有效名称,但保持组/级别相同,例如以下情况可以正常: &#34; T.0&#34; &#34; T.0&#34; &#34; T.4minus&#34; &#34; T.4plus&#34; &#34; T.4plus&#34;

但是,当使用make.names()时,所有无效字符都会转换为相同的字符:

(grps2 <- as.factor(make.names(grps)))
[1] T.0  T.0  T.4. T.4. T.4.
Levels: T.0 T.4.

因此,T = 4-和T = 4 +都被赋予相同的名称并且丢失了一个级别(这会在后续分析中引起问题)。另外,设置unique = TRUE并不能解决问题,因为

(grps3 <- as.factor(make.names(grps,unique=TRUE)))
[1] T.0    T.0.1  T.4.   T.4..1 T.4..2
Levels: T.0 T.0.1 T.4. T.4..1 T.4..2

和T = 4 +组分为2个不同的组,并获得水平。

是否有人知道如何在保持相同级别的同时将因子变为有效名称? 请记住,用户输入可能会有很大差异,因此请手动更换&#34; - &#34;与&#34;减去&#34;在这里不起作用。

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

使用mapvalues中的plyr功能,您可以执行以下操作:

require("plyr")
mapvalues(grps, levels(grps), make.names(levels(grps), unique=TRUE))

由于这直接在级别而不是因子上起作用,因此值的数量保持不变。

答案 1 :(得分:1)

与因子级别相关联的标签不需要符合对象名称的相同期望。请考虑以下示例,其中我重命名gear数据集的mtcars列,使其成为一个因素,并为其提供与示例中相同的级别。

library(magrittr)
library(dplyr)
library(broom)
D <- mtcars[c("mpg", "gear")] %>%
  setNames(c("y", "grps")) %>%
  mutate(grps = factor(grps, 3:5, c("T=0", "T=4-", "T=4+")))

请注意,我能够拟合线性模型,获取摘要,将其强制转换为数据框,同时级别名称包含=-+其中的符号。

fit <- lm(y ~ grps, data = D)

fit
Call:
lm(formula = y ~ grps, data = D)

Coefficients:
(Intercept)     grpsT=4-     grpsT=4+  
     16.107        8.427        5.273  


summary(fit)

Call:
lm(formula = y ~ grps, data = D)

Residuals:
    Min      1Q  Median      3Q     Max 
-6.7333 -3.2333 -0.9067  2.8483  9.3667 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)   16.107      1.216  13.250 7.87e-14 ***
grpsT=4-       8.427      1.823   4.621 7.26e-05 ***
grpsT=4+       5.273      2.431   2.169   0.0384 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 4.708 on 29 degrees of freedom
Multiple R-squared:  0.4292,    Adjusted R-squared:  0.3898 
F-statistic:  10.9 on 2 and 29 DF,  p-value: 0.0002948



tidy(fit)

         term  estimate std.error statistic      p.value
1 (Intercept) 16.106667  1.215611 13.249852 7.867272e-14
2    grpsT=4-  8.426667  1.823417  4.621361 7.257382e-05
3    grpsT=4+  5.273333  2.431222  2.169005 3.842222e-02

所以我想到了

  1. 你自己比自己更难做事,或者
  2. 目前还不清楚为什么需要使语法有效的对象名称。