繁体   English   中英

组合类别变量以在R中创建新的类别变量

[英]Combing a categorical variable to create a new categorical variable in R

更新

我想基于我的数据框中现有的分类变量创建一个新的分类变量。 我要这样做的方法是通过合并某些级别的值并创建不同的级别

这是工作

fac1 <- c("A","B", "C", "E", "F", "10", "11", "12", "19")
x1       <- c(NA,2,NA,3,4,5,6,7,NA)
data1    <- data.frame(fac1,x1)  

    fac1 x1
1    A NA
2    B  2
3    C NA
4    E  3
5    F  4
6   10  5
7   11  6
8   12  7
9   19 NA

考虑到data1是工作数据帧, fact1是类别变量。 基于上面看到的级别以及x1显示的值,我想创建一个新的分类变量,该变量将fac1的级别组合起来以创建新级别,并取x显示的各个值的平均值

预期结果:

     fac1  fac2 x1
1    A     A NA
2    B     B  2
3    C   C-E  3
4    E   C-E  3
5    F     F  4
6   10 10-12  6
7   11 10-12  6
8   12 10-12  6
9   19    19 NA

更新2

大多数答案都能正常工作,由于某种原因,``x1''中的值都用均值填充-我已经按不同类别进行了解释,但存在相同的问题。我无法理解数据库中问题的根源,我怀疑这是与mean函数有关。

这是我从我的原始数据库中获得的信息,其中x1是根据此示例替换旧值的变量。

 ind   year  HH_index cou   ind_2 ind2     x1
   <fct> <chr>    <dbl> <chr> <chr> <fct> <dbl>
 1 A     1995        NA AT    A     A     0.188
 2 B     1995        NA AT    B     B     0.188
 3 10-12 1995        NA AT    10-12 10-12 0.188
 4 10    1995        NA AT    10-12 10-12 0.188
 5 11    1995        NA AT    10-12 10-12 0.188
 6 12    1995        NA AT    10-12 10-12 0.188
 7 13    1995        NA AT    13-15 13    0.188
 8 14    1995        NA AT    13-15 14    0.188
 9 D     1995        NA AT    D-E   D-E   0.188
10 15    1995        NA AT    13-15 15    0.188

如果我理解正确,假设您只想组合C和E行,那么您想要的内容将类似于以下内容:

library(data.table)
setDT(data1)
data1[fac1 %in% c("C", "E"), c("fac2", "x1") := .("C-E", mean(x1))]
data1[is.na(fac2), fac2 := fac1]

尽管在您的情况下, fac1 %in% c("C", "E")x1平均值不是3 ,但它是NA 如果要删除NA ,只需在平均值上加上na.rm = TRUE即可。

过程中的关键是找到一种方法,以一种过程可以理解的方式来指定分组哲学。 鉴于您要将不同的值分组在一起,最简单的方法是创建分组的查找表,该表将由流程使用。

请参阅以下示例:

# example data
fac1 <- c("A","B", "C", "E", "F", "10", "11", "12", "19")
x1       <- c(NA,2,NA,3,4,5,6,7,NA)
data1    <- data.frame(fac1,x1, stringsAsFactors = F) 

library(dplyr)

# specify values to group together as a look up table
# (this is what you should create to specify your grouping philosophy)
look_up = data.frame(fac1 = c("C","E","10","12"),
                     group = c(1,1,2,2), stringsAsFactors = F)

look_up

#   fac1 group
# 1    C     1
# 2    E     1
# 3   10     2
# 4   12     2


# update look up table
# (you can create a look up table like this straight away if you prefer)
look_up = look_up %>% 
  group_by(group) %>% 
  mutate(fac2 = paste0(fac1, collapse = "-")) %>%
  ungroup() %>%
  select(-group)

look_up

# # A tibble: 4 x 2
#   fac1  fac2 
#   <chr> <chr>
# 1 C     C-E  
# 2 E     C-E  
# 3 10    10-12
# 4 12    10-12


data1 %>%
  left_join(look_up, by="fac1") %>%
  group_by(fac2 = ifelse(is.na(fac2), fac1, fac2)) %>%
  mutate(x1 = mean(x1, na.rm = T)) %>%
  ungroup()

# # A tibble: 9 x 3
#   fac1     x1 fac2 
#   <chr> <dbl> <chr>
# 1 A       NaN A    
# 2 B         2 B    
# 3 C         3 C-E  
# 4 E         3 C-E  
# 5 F         4 F    
# 6 10        6 10-12
# 7 11        6 11   
# 8 12        6 10-12
# 9 19      NaN 19 

您可以尝试使用plyrmapvalues函数与tidyverse一起重命名因子标签。 其中from是要替换的项目的向量,而to是替换值相同长度的向量。 然后分组并计算新的x1值。

library(tidyverse)
data1 %>% 
  mutate(fac2=plyr::mapvalues(fac1, from = c("C", "E", 10:12), 
                                    to = rep(c("C-E", "10-12"),c(2,3)))) %>% 
  group_by(fac2) %>% 
  mutate(x1=mean(x1, na.rm = T))
# A tibble: 9 x 3
# Groups:   fac2 [6]
  fac1     x1 fac2 
  <fct> <dbl> <fct>
1 A       NaN A    
2 B         2 B    
3 C         3 C-E  
4 E         3 C-E  
5 F         4 F    
6 10        6 10-12
7 11        6 10-12
8 12        6 10-12
9 19      NaN 19   

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM