【问题标题】:Make a new variable with selected levels of another variable使用另一个变量的选定级别创建一个新变量
【发布时间】:2018-03-14 21:36:57
【问题描述】:

我在创建具有另一个变量的选定级别的新变量时遇到问题。数据集是gss,变量是class,有5个级别“Lower Class”“Working Class”“Middle Class”“Upper Class”“No Class”和NA

如果我跑,

gss %>% 
select(class) %>%
str()

它给了我

'data.frame':   57061 obs. of  1 variable:
$ class: Factor w/ 5 levels "Lower Class",..: 3 3 2 3 2 3 3 2 2 2 ...

由于我只对那些指定他们经济等级的人感兴趣,我想去掉“No Class”级别和NA。我不知道有什么更好的方法,所以我做了

gss <- gss %>%
mutate(filteredclass = ifelse(class == "Lower Class", "Lower Class", 
ifelse(class == "Working Class", "Working Class", ifelse(class == "Middle 
Class", "Middle Class", ifelse(class == "Upper Class", "Upper Class", NA)))))

然后,我试着看看它是否有效,所以我跑了:

with (gss, table(filteredclass))

然后给了我如下混合顺序:

filteredclass
Lower Class  Middle Class   Upper Class Working Class 
     3147         24289          1741         24458

我希望新变量filteredclass 显示为与变量'class' 相同的顺序。因为如果我对变量“类”做同样的事情,它会给我:

with (gss, table(class))
class
Lower Class Working Class  Middle Class   Upper Class 
     3147         24458         24289          1741 
 No Class 
        1 

有什么办法可以解决这个问题吗?或者,有什么方法可以在不通过上面执行的 mutate 命令的情况下取出 No Class 级别?

提前感谢您的帮助!

【问题讨论】:

  • dput(gss) 并在您的问题中分享输出。如果 data.frame 很大,您只能共享大约 20 行。
  • 您想删除带有 'No Class' 和 NA 的行吗?你说的“取出”是什么意思?另外,请添加 dput。

标签: r dplyr r-factor


【解决方案1】:

最简单的方法是 factor 上课:

gss$filteredclass <- factor(gss$class, c("Lower Class", "Working Class",
                             "Middle Class", "Upper Class"))

这将省略“No class”并将其设置为NA

【讨论】:

    【解决方案2】:

    将来,如果您提供reproducible example,会更容易。

    如果你想摆脱“No Class”,你可以使用filter

    gss <- gss %>% 
      filter(class != "No Class") %>%
      droplevels()
    

    要删除 NA,只需使用

    gss <- na.omit(gss)
    

    【讨论】:

    • na.omit() 我认为如果 any 的单元格为 NA,则会删除行。 tidyr::drop_na(class)(在 mutate 子句中)仅当“类”变量为 NA 时才会删除一行。
    【解决方案3】:

    您必须使用与gss$class 相同的顺序重新调整因子。 为此,您可以在 mutate() 语句中添加另一行,在其中创建具有相同级别的因子并删除未使用的级别(无类)。

    library(tidyverse)
    # Generate the data you showed
    gss <- data.frame(class = factor(sample(c("Lower Class",  "Working Class",  "Middle Class",    "Upper Class", NA, "No Class"), 
                                            45000, replace = TRUE))) %>%
      mutate(class = factor(class, levels = c("Lower Class",  "Working Class",  "Middle Class",    "Upper Class", "No Class", NA)))
    
    # Sampled data
    with(gss, table(class, useNA = "always"))
    
    # Mutate gss the way you did it
    gss <-  gss %>%
      mutate(filteredclass = ifelse(class == "Lower Class", "Lower Class", 
                                    ifelse(class == "Working Class", "Working Class",
                                           ifelse(class == "Middle Class", "Middle Class", 
                                                  ifelse(class == "Upper Class", "Upper Class", NA)))),
             # Then make filteredclass into a factor with the same levels as class
             # Use droplevels() to remove unused classes (since we removed the No Class)
             filteredclass = droplevels(factor(filteredclass, levels = levels(class))))
    
    with(gss, table(class))
    with(gss, table(filteredclass))
    

    输出是这样的,

    > with(gss, table(class, useNA = "always"))
    class
      Lower Class Working Class  Middle Class   Upper Class      No Class 
             7362          7469          7626          7450          7457 
             <NA> 
             7636 
    
    > with(gss, table(class))
    class
      Lower Class Working Class  Middle Class   Upper Class      No Class 
             7362          7469          7626          7450          7457 
    
    > with(gss, table(filteredclass))
    filteredclass
      Lower Class Working Class  Middle Class   Upper Class 
             7362          7469          7626          7450 
    

    更快的方法是使用droplevels() 而不是ifelse()statements 链

    # Filter/remove obs where class is No Class or NA
    with(gss %>% mutate(filteredclass = droplevels(class, exclude = c(NA, "No Class"))),
         table(filteredclass))
    
    
    filteredclass
      Lower Class Working Class  Middle Class   Upper Class 
             7362          7469          7626          7450 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-09-29
      • 1970-01-01
      • 2021-10-24
      • 2022-11-24
      • 2019-07-31
      • 2021-08-18
      • 1970-01-01
      相关资源
      最近更新 更多