2017-09-06 106 views
2

我正在处理大型数据框,而不是将操作写入内存,我一直试图尽可能多地使用管道。在试图检查我的因素水平的中间步骤中,我遇到了一个问题,使用levels函数,并想知道是否有人可能知道问题是什么。无法将管道变量转换为水平

一个例子:

library(dplyr) 
Data <- data.frame(x = rep(LETTERS[1:5],3), 
        y = sample(1:10,length(x), replace=T)) 

通常的工作方式:

levels(Data$x) 
[1] "A" "B" "C" "D" "E" 

如果我使用sapply它主要作品:

Data %>% select(x) %>% sapply(levels) 
    x 
[1,] "A" 
[2,] "B" 
[3,] "C" 
[4,] "D" 
[5,] "E" 

但管道不能正常工作,并返回NULL

Data %>% select(x) %>% levels() 
NULL 

为什么Data %>% select(x) %>% levels()返回NULL

有没有办法使用管道数据的水平?

回答

5

select给出了一个数据帧,但levels需要一个向量作为参数,这就是为什么它们不能一起工作;与pipe使用levels

您可以使用.$x以提取水平的方法列:

Data %>% select(x) %>% {levels(.$x)} 
# [1] "A" "B" "C" "D" "E" 

或者更好的办法利用pull代替selectpull给列向量/系数:

Data %>% pull(x) %>% levels() 
# [1] "A" "B" "C" "D" "E" 
+1

完美!谢谢! – JLC

+0

有没有办法通过上述两种方法将两个变量传递给关卡? – JLC

+0

我不这么认为。如果你有多个变量,像你一样选择然后应该是正确的方法。 – Psidom