我正在制作一个生物信息学闪亮的应用程序,它从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;在这里不起作用。
提前感谢您的帮助!
答案 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
所以我想到了