2016-08-20 53 views
0

我试图根据另外两个计算的分类变量(包含“是”或“否”类别)为一个组分配一个分类变量(是或否)。如果一行对前两个计算的变量都有“是”,我希望整个组被分配为“是”。必须有更好的方法来做到这一点与过滤器或一些窗口排序功能。下面是我到目前为止所做的那些混乱的代码。 filteredDF是我希望得到的输出。谢谢!使用dplyr将分类变量分配给组的更好方法?

#install.packages('nycflights13', 'dplyr') 
library('nycflights13') 
library('dplyr') 
data(flights) 

filteredDF <- flights %>% 
    mutate(variable1 = ifelse(month %in% c(1:6) & day %in% c(16:28), yes = 'yes', no = 'no')) %>% #create first calculated categorical variable 
    mutate(variable2 = ifelse(month %in% c(7:12, 6) & day %in% c(1:16) , yes = 'yes', no = 'no')) %>% #create second calculated categorical variable 
    group_by(tailnum) %>% # assign groups I'm interested in 
    mutate(varTogether = ifelse('yes' %in% variable1 & 'yes' %in% variable2, yes = 'yes', no = 'no')) %>% # create 3rd categorical to filter by (assigned by group) 
    ungroup() %>% 
    filter(varTogether == 'yes') # filter out what I want 
+0

@DirtySockSniffer谢谢,我会补充说,以 –

+0

你不需要做到这一点的问题。你可以在加载包装后输入'flights',但没关系。 –

回答

2

我没有测试过这一点,但它似乎更容易使用逻辑变量(TRUE/FALSE)而不是分类('yes'/'no')变量...这不缩短的东西非常多,但它确实清理了一下。

filteredDF <- flights %>% 
    mutate(variable1 = month %in% 1:6 & day %in% 16:28, 
     variable2 = month %in% 7:12 & day %in% 1:16) %>% 
    group_by(tailnum) %>% 
    mutate(varTogether = any(variable1) & any(variable2)) %>% 
    ungroup() %>% 
    filter(varTogether) 

(我假设c(7:12, 6)是一个错误。另外,你真的要当天范围两个变量重叠?)

你可以省略中间缩短了一点点变量,但这可能不太可读。 (或者你可以定义一个函数vt <- function(month,day) any(...) & any(...)

filteredDF <- flights %>% 
    group_by(tailnum) %>% 
    mutate(varTogether=any(month %in% 1:6 & day %in% 16:28) & 
        any(month %in% 7:12 & day %in% 1:16)) %>% 
    ungroup() %>% 
    filter(varTogether) 
+0

我喜欢这两种解决方案,两者似乎更具可读性。至于日/月重叠,我最初并不打算让它们重叠,但是我急于用公开可用的数据集提问,我只是想要一些能够产生有效数据框的东西。我现在意识到,他们不需要重叠就会发生。谢谢你的帮助! –